查找所有元素具有相同符号的序列,然后更改符号



我有一系列包含7个元素的列表(但可以是任何数字)。我试图找到所有正元素,所有负元素,以及在任意点改变符号的列表,

例如[3, 6, 7, -2, -5, -1, -1][3, 1, -1, -2, -1, -5, -1]

请注意,虽然我在我的例子中使用了integers,但lists实际上是由floats组成的。

我可以很容易地找到所有总是正或负的列表,但我如何找到那些改变符号的列表(它可以从正到负,如在示例中或从负到正)。

使用for循环从第0个元素迭代到倒数第二个元素,并比较符号或检查两个连续数字的乘积是否小于0。

如果是,则在列表中添加元素。

假设该系列为

0     [3, 6, 7, -2, -5, -1, -1]
1    [3, 1, -1, -2, -1, -5, -1]
dtype: object

你可以试着得到list in Series中每个元素的符号,并将它们相加。

  • 如果结果为7,则表示全部为正,
  • 如果结果为-7,表示全部为负
  • 否则,可能会改变标志。(考虑到零)
m = s.apply(lambda lst: sum(map(np.sign, lst)))
print(m)
0   -1
1   -3
dtype: int64

考虑列表为零,可以加入符号列表,检查是否存在1,-1-1,1

n = s.apply(lambda lst: ','.join(map(str, map(np.sign, lst))))
n = n.str.contains('1,-1|-1,1')
print(n)
0    True
1    True
dtype: bool

如果不限制0位,可以直接检查符号列表

中是否有1-1
n = s.apply(lambda lst: {1, -1}.issubset(set(map(np.sign, lst))))

这样的东西可以在numpy中更好地实现,开销更少

x = np.array([[3, 6, 7, -2, -5, -1, -1],[3, 1, -1, -2, -1, -5, -1]])
allpositive = (x>0).all(axis=1)
allnegative = (x<0).all(axis=1)
mixed =  ((x>0)|(x<0)).any(axis=1)

特定数据集的结果:

>>> x
array([[ 3,  6,  7, -2, -5, -1, -1],
[ 3,  1, -1, -2, -1, -5, -1]])
>>> allpositive
array([False, False])
>>> allnegative
array([False, False])
>>> mixed
array([ True,  True])

根据您的喜好调整行为以覆盖0符号。

相关内容

最新更新