切片numpy数组时使用python的逻辑运算符

use*_*251 4 python arrays slice

我想在二维numpy数组上执行切片:

type1_c = type1_c[
    (type1_c[:,10]==2) or
    (type1_c[:,10]==3) or
    (type1_c[:,10]==4) or
    (type1_c[:,10]==5) or
    (type1_c[:,10]==6)
]
Run Code Online (Sandbox Code Playgroud)

语法看起来正确; 但是我收到以下错误消息:'具有多个元素的数组的真值是不明确的.使用a.any()或a.all()'

我真的不明白出了什么问题.任何的想法?

DSM*_*DSM 7

or当它在两个标量之间时是明确的,但是什么是正确的向量推广?if x == array([0, 0])y == array([0,1]),应该x or y是(1)False,因为并非所有成对术语or-ed一起为True,(2)为True,因为至少有一对成对or结果为真,(3)array([0, 1]),因为那是a的成对结果or,(4)array([0, 0]),因为[0,0] or [0,1]将返回[0,0],因为非空列表是truthy,所以应该arrayS为?

您可以|在这里使用,并将其视为一个按位问题:

>>> import numpy as np
>>> vec = np.arange(10)
>>> vec[(vec == 2) | (vec == 7)]
array([2, 7])
Run Code Online (Sandbox Code Playgroud)

明确使用numpys向量化逻辑或:

>>> np.logical_or(vec==3, vec==5)
array([False, False, False,  True, False,  True, False, False, False, False], dtype=bool)
>>> vec[np.logical_or(vec==3, vec==5)]
array([3, 5])
Run Code Online (Sandbox Code Playgroud)

或使用in1d,这在这里效率更高:

>>> np.in1d(vec, [2, 7])
array([False, False,  True, False, False, False, False,  True, False, False], dtype=bool)
>>> vec[np.in1d(vec, [2, 7])]
array([2, 7])
Run Code Online (Sandbox Code Playgroud)