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

Pas*_*ten 5 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
Run Code Online (Sandbox Code Playgroud)

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

它应该评估为:

array([True,True,True,True,True])
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*kov 9

有一个功能:

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

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

Numpy定义了__and__覆盖&运算符的数组函数.这就是另一个答案所使用的.


tom*_*m10 8

你可以使用&,例如:

x = np.arange(10)
(x<8) & (x>2)
Run Code Online (Sandbox Code Playgroud)

array([False, False, False,  True,  True,  True,  True,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

一些细节:

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

  • 你不能在Python中覆盖`和`运算符. (2认同)