Python 用于将条件应用于numpy数组的选项
我想对numpy数组应用条件,我觉得有更好的方法。例如,我想知道元素在哪里等于2或3Python 用于将条件应用于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]) 这很好,因为现在我所有
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
覆盖了返回数组的相等性(以非常有用的方式),这使得在某些情况下确实需要将==
绑定得更紧,这确实会让您的思维有些扭曲。