如何使用numpy.where与逻辑运算符

rfe*_*and 41 python numpy where logical-operators

我试图找到一个数组中大于a但小于b的所有元素的索引.这可能只是我的语法问题,但这不起作用:

numpy.where((my_array > a) and (my_array < b))
Run Code Online (Sandbox Code Playgroud)

我该怎么解决这个问题?或者有更好的方法吗?

谢谢!

Mar*_*son 61

这有两种方式:

In [1]: my_array = arange(10)

In [2]: where((my_array > 3) & (my_array < 7))
Out[2]: (array([4, 5, 6]),)

In [3]: where(logical_and(my_array > 3, my_array < 7))
Out[3]: (array([4, 5, 6]),)
Run Code Online (Sandbox Code Playgroud)

对于第一个(替换and&),请注意适当地添加括号: &优先级高于比较运算符.你也可以使用*,但我不推荐它:它是hacky并且不会产生可读的代码.

In [4]: where((my_array > 3) * (my_array < 7))
Out[4]: (array([4, 5, 6]),)
Run Code Online (Sandbox Code Playgroud)

  • “ hacky”是什么意思?为什么它总是返回“(array([4,5,6]),)”而不是仅仅返回“ array([4,5,6])”?返回的事物的“其中没有第二个事物的元组”语法的背后的主意是什么? (2认同)
  • @usethedeathstar:(1)hacky位是主观的.我想我的问题是(对我来说,至少)代码的表面读数与意图没有明显的匹配.(2)对于`where`,它返回一个元组,因为在一般情况下`where`在两个`n`维数组上运行并返回一个'n`元组的结果; 在这里你会看到`n = 1`的特殊情况.元组容器有点难看,但与更高维度的情况不一致可能会更加丑陋.(耶!更具主观性!) (2认同)