【问题标题】:Find sign change in set of positive and negative numbers using numpy?使用numpy查找正数和负数集中的符号变化?
【发布时间】:2020-08-13 23:49:24
【问题描述】:

我有一组数字,其中列索引 3 有负数和正数,因此模式从正数变为负数。如何使用 Numpy 数组检查这一点,我正在考虑计算列的总和,如果它少于行数,那么就会发生符号变化。 Numpy 中是否有任何功能可以更有效地执行此操作,可能类似于 XOR

import numpy as np
t = [[363.57, 363.57, 1, 1, 1, 1, 1, 1],
 [385.41, 385.41, 1, -1, 1, 1, 1, 1],
 [406.12, 406.12, 1, -1, 1, 1, 1, 1],
 [424.2, 424.2, 1, -1, 1, 1, 1, 1],
 [444.91, 444.91, 1, -1, 1, 1, 1, 1],
 [468.26, 468.26, 1, -1, 1, 1, -1, 1]]

x = np.array(t)
x[:, 3]

我不喜欢下面的解决方案,因为如果我有超过 100 K 行,它就太庞大了。

if sum(x[:, 3]) <= x.shape[0]:
   print("sign change happend")

我可以更改数据结构,这就是我将其存储在变量t 中的方式。尝试使用 numpy 以更高效、更快速的方式进行操作。

预期输出

if col_3_sign_changed: 
   # do something 

【问题讨论】:

  • 你想要的输出是什么?只是第 3 列是否有多个符号的布尔值?
  • 是的,只是布尔值
  • 我认为您已经建议的解决方案非常好。也许您也想使用符号来解释非单位值np.sign(x[:,3]).sum()&lt;x.shape[0]

标签: python numpy


【解决方案1】:

这里有一些选项:

np.any(np.diff(x[:,3]))

或(有问题的建议):

np.sign(x[:,3]).sum()<x.shape[0]

或(如@Prune 建议的那样):

np.any(np.roll(x[:,3],1)!=x[:,3])

【讨论】:

    【解决方案2】:

    您的问题可能更清楚,但如果您正在寻找是否存在正值和负值而不是正值,那么这个简单的东西就足够了:

    value_signs = set(np.sign(x[:,3]).flatten())
    
    if len(value_signs) == 2:
        print("positive and negative signs present")
    else:
        print("just one sign present")
    

    【讨论】:

      【解决方案3】:

      您的规范允许使用多种值,而不仅仅是 +1 和 -1。我建议您使用以下步骤:

      • 创建一个布尔向量,指示 + 和 - 值
      • shift向量一位置
      • 将移位后的向量与原始向量进行比较

      如果你愿意,你可以在一行中完成。

      你能从那里处理编码吗?

      【讨论】:

      • 移位向量是什么意思?
      • 查找“numpy shift”有什么不明白的地方?
      • 你的意思是np.any(np.roll(x[:,3],1)!=x[:,3])?如果是这样,这是另一种方式,但我认为会更慢。
      • 明白了,努力理解shift
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      相关资源
      最近更新 更多