Python 用于将条件应用于numpy数组的选项

Python 用于将条件应用于numpy数组的选项,python,numpy,Python,Numpy,我想对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]) 这很好,因为现在我所有

我想对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])
这很好,因为现在我所有的条件逻辑都可以放在一个地方,但由于与列表的转换,感觉有点笨拙。它对于多维数组也不太适用


有没有我遗漏的更好的替代方案?

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

result = a[result]
但是,在这种情况下,由于您使用的是布尔掩码(
True
/
False
大约相当于
1
/
0
),因此您实际上可以使用位掩码或执行与
逻辑掩码或
相同的操作:

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

这里有一句话要小心——确保使用括号。否则,这些表达式中的运算符优先级可能有点糟糕(
|
绑定比
==
更紧)

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

result = a[result]
但是,在这种情况下,由于您使用的是布尔掩码(
True
/
False
大约相当于
1
/
0
),因此您实际上可以使用位掩码或执行与
逻辑掩码或
相同的操作:

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

这里有一句话要小心——确保使用括号。否则,这些表达式中的运算符优先级可能有点糟糕(
|
绑定比
==
更紧)

您可以使用
delete
numpy数组中删除元素

np.delete(a,[0,1,4])
或者如果你想保留补语

np.delete(a,np.delete(a,[2,3]))

您可以使用
delete
numpy数组中删除元素

np.delete(a,[0,1,4])
或者如果你想保留补语

np.delete(a,np.delete(a,[2,3]))

您可以将视图组合在一起以获得任意复杂的结果(&A):

>>> 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
您可以使用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)
def测试(x): ... 返回x>10和x>>v=np.矢量化(测试) >>>五(A) 数组([[False,False,False,False,False], [假,假,假,真,假], [假,假,假,真,假], [假,假,假,假,假], [False,False,False,False,False]],dtype=bool)
您可以将视图组合在一起以获得任意复杂的结果(&C):

>>> 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
您可以使用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)
def测试(x): ... 返回x>10和x>>v=np.矢量化(测试) >>>五(A) 数组([[False,False,False,False,False], [假,假,假,真,假], [假,假,假,真,假], [假,假,假,假,假], [False,False,False,False,False]],dtype=bool)
(a==2)|(a==3)正是我想要的。Thanks@Hammer--是的。通常,我们期望数学运算绑定得比等式更紧:
如果foo+2==3:…
。事实上,
numpy
覆盖了返回数组的相等性(以非常有用的方式),这使得在某些情况下需要将
==
绑定得更紧,这确实会让你有点心烦意乱。(a==2)|(a==3)正是我想要的。Thanks@Hammer--是的。通常,我们期望数学运算绑定得比等式更紧:
如果foo+2==3:…
。事实上,
numpy
覆盖了返回数组的相等性(以非常有用的方式),这使得在某些情况下确实需要将
==
绑定得更紧,这确实会让您的思维有些扭曲。