在numpy数组中组合逻辑语句AND

时间:2014-02-24 19:07:38

标签: python arrays numpy

当矩阵中的两个条件为True时,选择元素的方法是什么? 在R中,基本上可以组合布尔的向量。

所以我的目标是:

A = np.array([2,2,2,2,2])
A < 3 and A > 1  # A < 3 & A > 1 does not work either

Evals to: ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

应该评估:

array([True,True,True,True,True])

我的解决方法通常是将这些布尔向量相加并等于2,但必须有更好的方法。它是什么?

3 个答案:

答案 0 :(得分:9)

有一个功能:

In [8]: np.logical_and(A < 3, A > 1)
Out[8]: array([ True,  True,  True,  True,  True], dtype=bool)

由于您无法在Python中覆盖and运算符,因此它总是尝试将其参数转换为bool。这就是为什么你的代码会出错。

Numpy已为数组定义__and__函数,该函数会覆盖&运算符。这就是另一个答案所用的。

答案 1 :(得分:8)

你可以使用&,例如:

x = np.arange(10)
(x<8) & (x>2)

给出

array([False, False, False,  True,  True,  True,  True,  True, False, False], dtype=bool)

一些细节:

  • 这是有效的,因为&是numpy ufunc bitwise_and的简写,bool类型与logical_and相同。也就是说,这也可以拼写为bitwise_and(less(x,8), greater(x,2))
  • 您需要括号,因为numpy &的优先级高于<>
  • and不起作用,因为它对于numpy数组来说是不明确的,所以numpy不是猜测,而是提出异常。

答案 2 :(得分:-1)

虽然这是原始的,但

有什么问题
A = [2, 2, 2, 2, 2]
b = []
for i in A:
  b.append(A[i]>1 and A[i]<3)
print b

输出为[True,True,True,True,True]