如何检测 numpy 数组中元素的符号变化

新手上路,请多包涵

我有一个带有正值和负值的 numpy 数组。

 a = array([1,1,-1,-2,-3,4,5])

我想创建另一个数组,它在每个发生符号变化的索引处包含一个值(例如,如果当前元素为正而前一个元素为负,反之亦然)。

对于上面的数组,我希望得到以下结果

array([0,0,1,0,0,1,0])

或者,数组中发生符号变化的位置列表或布尔值列表而不是 0 和 1 都可以。

原文由 Robert Christie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 877
2 个回答

就像是

a = array([1,1,-1,-2,-3,4,5])
asign = np.sign(a)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
print signchange
array([0, 0, 1, 0, 0, 1, 0])

现在,numpy.roll 进行循环移位,所以如果最后一个元素的符号与第一个不同,则 signchange 数组中的第一个元素将为 1。如果不需要,当然可以做一个简单的

signchange[0] = 0

此外, np.sign 认为 0 有它自己的符号,不同于正值或负值。例如,[-1,0,1] 的“signchange”数组将是 [0,1,1],即使零线仅“越过”一次。如果这是不需要的,可以插入行

sz = asign == 0
while sz.any():
    asign[sz] = np.roll(asign, 1)[sz]
    sz = asign == 0

在第一个示例中的第 2 行和第 3 行之间。

原文由 janneb 发布,翻译遵循 CC BY-SA 2.5 许可协议

(numpy.diff(numpy.sign(a)) != 0)*1

原文由 Christian Alis 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题