我在寻找一种高效优雅的方式来做到这一点。我希望这个例子能够解释我的担忧。numpy slice assignment
我们已经有了一个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,但是这不提供这样的行为。
我该如何达到这个效率?
的corrent行为是这样的(但很效率不高/不雅):
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 + 2 * np.pi'有点奇怪?你可能意指'欧米茄[欧米茄<0.0] + = 2 * np.pi'。 (第一种形式为'omega'的所有元素添加'2 * np.pi',然后使用这个新数组中的第一个条目作为'omega'的第一个否定条目的值 - 值变得很奇怪) – 2012-02-09 15:34:29
@SvenMarnach哇,当你用2d或3d数组做它时,它会给出一个错误,“数组不能广播以纠正形状”,当你做omega [:] = wrong_size_array时,它会给出一个错误,所以它有点奇怪的是,1d布尔索引案例不检查不匹配。 – 2012-02-09 18:00:07
@Bago:这种行为实际上是记录在案的。它有时是有用的,但对于更高维度没有有用的概括。 – 2012-02-09 18:11:01