python - 在 NumPy 中进行元素操作时,添加条件语句的最佳方法是什么?
问题描述
我有一个正整数列表,我想从所有元素中重复减去最小元素,但前提是该元素不是最小值的实例。例如,在一次迭代中
a = np.array([3, 5, 9, 3, 3])
[3, 2, 6, 3, 3]
最终变成[1,1,1,1,1]
.
也就是说,没有条目会减少到 0。我怀疑可能存在一种简单的方法来修改a - min(a)
,并且不会变为 0,但我不知道a[0]
。a[3]
a[4]
我知道这可以通过列表理解来完成:
while len(set(arr)) > 1:
arr = [a - min(arr) if a > min(arr) else a for a in arr]
虽然数组可能非常大,所以考虑到时间效率,我希望 NumPy 有一种方便的方法来做到这一点。我对 Python 很陌生,因此感谢所有能力的更正/信息。
解决方案
这可以使用where
函数的 3 子句变体来处理:
>>> import numpy as np
>>> a = np.array([3, 5, 9, 3, 3])
>>> m = a.min()
>>> np.where(a != m, a - m, m)
array([3, 2, 6, 3, 3])
并将其包装在 while 循环中。
除了使用set
,您还可以使用numpy.unique
:
while len(np.unique(a)) > 1:
m = a.min()
a = np.where(a != m, a - m, m)
但是您应该分别对两种变体(set
与unique
、列表理解与where
)进行计时,以查看对较大数组最有效的方法。
另一个变体是比较最大值和最小值:也许a.max()
可以比 计算得更快np.unique
:
while True:
m = a.min()
if m == a.max():
break
a = np.where(a != m, a - m, m)
推荐阅读
- python - Python 不能正常使用回车符(新行)
- haskell - 99 个 Haskell 问题 #9
- c# - 如何保护应用程序免受 xsrf 攻击并在 asp.net core react js 应用程序中使用 AntiForgeryToken
- powershell - 找不到驱动器。名为“c”的驱动器不存在
- webclient - 在 ParallelFlux 上使用线程睡眠时,它不等待睡眠线程完成并执行 onComplete() 函数
- javascript - 有什么方法可以获取可观察数组的最后 10 个对象
- mongodb - 处理 mongo 上的预定义标签云/标签
- javascript - laravel Livewire 电线:点击不触发功能
- c# - ping 目标端口后 Tcp 未连接
- python - 由于环境错误而无法安装软件包 https://pypi.org/simple/pprint/