我想将条件应用于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])
这很好,因为现在我的所有条件逻辑都可以在一个地方生活在一起但由于转换到列表和从列表转换而感觉有点笨拙。对于多维数组,它也不能很好地工作。
我缺少一个更好的选择吗?
答案 0 :(得分:3)
有必要指出的是,在第一个示例中,您有一个逻辑数组,而不是数组[2, 3]
(就像您在第二个示例中所获得的那样)。要从第二个答案中恢复结果,您需要
result = a[result]
但是,在这种情况下,由于您使用的布尔掩码(True
/ False
大约等于1
/ 0
),您实际上可以使用按位或做与logical_or
相同的事情:
result = a[(a==2) | (a==3)]
这里要小心 - 确保使用括号。否则,运算符优先级在这些表达式中可能有点讨厌(|
比==
更紧密。
答案 1 :(得分:1)
您可以使用numpy array
delete
中删除元素
np.delete(a,[0,1,4])
或者如果你想保留补充,
np.delete(a,np.delete(a,[2,3]))
答案 2 :(得分:1)
你可以&一起观看以获得任意复杂的结果:
>>> 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)