我正在寻找一种高效而优雅的方式来做到这一点。我希望这个例子可以解释我的担忧。
我们有一个像这样的np.array:
omega = np.array([1.03415121504, 1.29595060284, 1.55774999064, 1.81954937844,
...
2.08134876623, 2.37359445321, -2.11179506541, -1.84999567761])
现在我想操纵它,比如
omega[omega < 0.0] = omega + 2 * np.pi
omega[omega >= 2 * np.pi] = omega - 2 * np.pi
第二个语句可能会覆盖第一个语句的计算值,然后会有一个交集。我找到了np.piecewise,但这并没有提供这样的行为。
我如何实现这一目标(高效)?
矫正行为就像那样(但非常低效/不优雅):
tmp = []
for o in omega:
if o < 0.0:
tmp.append(o + 2 * np.pi)
elif o >= (2 * np.pi):
tmp.append(o - 2 * np.pi)
else:
tmp.append(o)
omega = np.array(tmp)
因此有人为了这样的目的而为numpy的nditer做过经历? (特别是关于性能/效率)
答案 0 :(得分:3)
您可以尝试使用np.select
:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.select.html
condlist = [omega < 0.0, omega >= 2.0*np.pi]
choicelist = [omega + 2.0*np.pi, omega - 2.0*np.pi]
omega = np.select(condlist,choicelist,default=omega)
答案 1 :(得分:2)
第二个语句可能会覆盖第一个语句的计算值。
这种情况无法实现。如果之前小于零,则添加2*pi
将永远不会使其大于或等于2*pi
无论如何,实现你想要的更简单的方法可能是
omega %= 2 * np.pi
答案 2 :(得分:2)
我建议对指数进行计算:
i = omega < 0.0
omega[i] += 2*np.pi
i = (~i) & (omega >= 2 * np.pi)
omega[i] -= 2*np.pi
第三行中的按位逻辑运算确保没有索引被使用两次。从你给出的例子来看,Sven Marnach的模数答案更有效率。如果你有一个更复杂的用例,你应该更新你的问题。