繁体   English   中英

numpy切片分配

[英]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

第二条语句可能会覆盖fist语句的计算值,然后有一个交集。 我发现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? (特别是关于性能/效率)

你可以尝试使用np.selecthttp://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)

第二条语句可能会覆盖第一条语句的计算值。

这是不可能的。 如果之前小于零,则加上2*pi绝不会使其大于或等于2*pi

无论如何,一种更简单的方法来实现您想要的是

omega %= 2 * np.pi

我建议对指数进行计算:

i = omega < 0.0
omega[i] += 2*np.pi
i = (~i) & (omega >= 2 * np.pi)
omega[i] -= 2*np.pi

第三行中的按位逻辑运算确保没有索引被使用两次。 从您给出的示例来看,Sven Marnach的模答案更为有效。 如果您有更复杂的用例,则可能应该更新您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM