1

我想将条件应用于 numpy 数组,我觉得那里有更好的方法。作为一个玩具示例,我想知道元素在哪里等于 2 或 3。

import numpy as np
a = np.arange(5)

一种方法是使用像这样的numpy函数逐个构造我的条件

result = np.logical_or(a == 2, a == 3)

人们可以看到这在更复杂的条件下如何变得笨拙。另一种选择是使用列表推导

result = np.array([x for x in a if x == 2 or x==3])

这很好,因为现在我所有的条件逻辑都可以放在一个地方,但由于与列表之间的转换而感觉有点笨拙。它也不适用于多维数组。

我缺少更好的选择吗?

4

3 回答 3

3

需要指出的是,在第一个示例中,您有一个逻辑数组,而不是数组[2, 3](就像您在第二个示例中得到的那样)。要从第二个答案中恢复结果,您需要

result = a[result]

但是,在这种情况下,由于您使用的是布尔掩码(True/False大约等同于1/ 0),因此您实际上可以按位使用或执行以下操作logical_or

result = a[(a==2) | (a==3)]

这里要注意一点——确保使用括号。否则,这些表达式中的运算符优先级可能有点讨厌(|比 绑定更紧密==)。

于 2013-05-01T17:40:27.543 回答
1

你可以删除元素numpy array形式delete

np.delete(a,[0,1,4])

或者如果你想保持补语,

np.delete(a,np.delete(a,[2,3]))
于 2013-05-01T17:40:32.040 回答
1

您可以 & together 视图以获得任意复杂的结果:

>>> A = np.random.randint(0, 100, 25).reshape(5,5)
>>> A
array([[98,  4, 46, 40, 24],
       [93, 75, 36, 19, 63],
       [23, 10, 62, 14, 59],
       [99, 24, 57, 78, 74],
       [ 1, 83, 52, 54, 27]])
>>> A>10
array([[ True, False,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True, False,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True]], dtype=bool)
>>> (A>10) & (A<20)
array([[False, False, False, False, False],
       [False, False, False,  True, False],
       [False, False, False,  True, False],
       [False, False, False, False, False],
       [False, False, False, False, False]], dtype=bool)
>>> (A==19) | (A==14)  # same output

您还可以编写一个函数并使用 map 在每个元素上调用该函数。在函数内部有你想要的尽可能多的测试:

>>> def test(ele):
...    return ele==2 or ele==3
... 
>>> map(test,np.arange(5))
[False, False, True, True, False]

您可以使用 numpy.vectorize:

>>> def test(x):
...    return x>10 and x<20
...
>>> v=np.vectorize(test)
>>> v(A)
array([[False, False, False, False, False],
       [False, False, False,  True, False],
       [False, False, False,  True, False],
       [False, False, False, False, False],
       [False, False, False, False, False]], dtype=bool)
于 2013-05-01T18:04:31.130 回答