import numpy as np
arr = np.array([1,1,-1,-2,-3,4,5])
result = []
for i, v in enumerate(arr):
if i == 0:
change = False
elif v < 0 and arr[i-1] > 0:
change = True
elif v > 0 and arr[i-1] < 0:
change = True
else:
change = False
result.append(change)
print result
a = np.array([0.4, 0.5, -0.2, -0.6, 5, 0, 0, 5, 0,-2])
# Get associated index
ind =np.arange(len(a))
# remove zero from array but keep original index
a2 =a[a!=0.]
ind2 =ind[a!=0.]
# Detect sign changes in reduced array
idx=np.where(np.diff(np.sign(a2)) != 0)[0] + 1
# Get sign changes index for original array
ind2[idx]
8条答案
按热度按时间z4bn682m1#
就像
现在,numpy.roll执行循环移位,因此如果最后一个元素的符号与第一个元素的符号不同,则signchange数组中的第一个元素将为1。
此外,np.sign认为0有自己的符号,不同于正值或负值。例如,[-1,0,1]的“signchange”数组将是[0,1,1],即使零线只“穿过”一次。如果不希望这样,可以插入线
型
在第一个例子中位于线2和线3之间。
vsdwdz232#
f4t66c6m3#
确定符号更改位置的三种方法
方法1:将数组中的相邻项相乘并求负数
方法2(最快):如果相邻符号不相等
型
方法三:正如ianalis所建议的。大多数IMO优雅,但有点慢
编辑:
对于大型阵列,方法1是最佳的。
14ifxucb4#
上面的答案使用了列表解析和一些愚蠢的魔法来得到你想要的结果。下面是一个非常直接的方法,虽然有点复杂,但也能做到这一点:
ee7vknir5#
不如
numpy.sign为0指定了自己的符号,因此0将是除其他0之外的任何符号的变化,这可能是您想要的。
1cosmwyk6#
另一个关于获取'strict'符号从正到负和从负到正(不包括零)变化的想法:
slsn1g297#
为了直接解释这个问题,当0不是自己的大小写时,使用
greater
可能比sign
更容易。当用
T
或F
打印以指示不同数字之间的符号变化时,得到:当使用以下方法打印时:
还要注意,这比原始数组少了一个元素,这是有意义的,因为你要求改变符号,如果你想包括最后一个和第一个元素之间的变化,你可以使用
roll
,就像其他人建议的那样。piv4azn78#
如果你只对一个方向的变化感兴趣(下面从负值到正值(正值包括零)):
arr = NP数组([1,1,-1,-2,-3,4,5])
其中(np.差((arr〉=0)*1)==1)
返回符号更改前每个最后负值的索引