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

53

我正在尝试找到数组中所有大于a且小于b的元素的索引。可能只是我的语法有问题,但这并没有起作用:

numpy.where((my_array > a) and (my_array < b))

我该如何修复这个问题?或者有更好的方法吗?

谢谢!


4
你尝试过使用逻辑运算符 & 而不是 and 吗? - RodericDay
1
仅仅用 & 替换 and 是不行的,但我刚发现这个可以:numpy.where((my_array > a) & (my_array < b) == True) - ylangylang
@user1803782:你能解释一下为什么用&代替and不起作用吗?这是解决这个问题的标准方法。 - Mark Dickinson
1
我其实不确定为什么第一次会出现错误。现在它可以正常工作了。是我的问题。但还是谢谢。 - ylangylang
1个回答

85

这里有两种方式:

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]),)

对于第一个问题(将and替换为&),需要注意适当添加括号: & 的优先级高于比较运算符。您也可以使用*,但我不建议这样做:它很巧妙,但不利于编写可读性代码。

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

2
“hacky”是什么意思?为什么它总是返回“(array([4,5,6]),)”而不是只返回“array([4,5,6])”?返回的东西中没有第二个元素的元组语法背后的想法是什么? - usethedeathstar
2
@usethedeathstar:(1)“hacky bit”是主观的。我认为它的问题在于,至少对我来说,代码的表面阅读并不清楚地反映了意图。(2)对于“where”,它返回一个元组,因为在一般情况下,“where”操作两个n维数组,并返回一个n元组的结果;这里你看到的是n=1的特殊情况。元组容器有点丑陋,但与高维情况不一致可能会更丑陋。(耶!更多主观性!) - Mark Dickinson
所以在这种情况下,我们得到一个一维数组,元组只有一个项目,而在二维情况下,您只需在元组中获得“x-index”数组和“y-index”数组,显示根据您制作的逻辑组合在您的2D数组中良好的点的x,y坐标? - usethedeathstar
@usethedeathstar:是的,完全正确。 - Mark Dickinson
1
Bah: “操作两个n维数组”应该改为“操作一个n维数组”。 - Mark Dickinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接