如果obj.ndim == x.ndim,x [obj]返回填充的1维数组 x的元素对应于obj的True值。该 搜索顺序将是行主,C风格。如果obj的真值为 超出x范围的条目,那么索引错误就会出现 被提高。如果obj小于x,则与填充它相同 假
我从numpy引用中读到,我可以使用较小的布尔数组索引较大的数组,其余的条目将自动填充为False。
示例: 从数组中,选择总和小于或等于2的所有行:
>>> x = np.array([[0, 1], [1, 1], [2, 2]])
>>> rowsum = x.sum(-1)
>>> x[rowsum <= 2, :]
array([[0, 1],[1, 1]])
但如果rowsum也有两个维度:
>>> rowsum = x.sum(-1, keepdims=True)
>>> rowsum.shape
(3, 1)
>>> x[rowsum <= 2, :] # fails
IndexError: too many indices
>>> x[rowsum <= 2]
array([0, 1])
最后一个因为额外的而只给出第一个元素 尺寸。
但是这个例子根本不起作用,它说“IndexError:布尔索引与维度1的索引数组不匹配;维度为2但对应的布尔维度为1”
如何使它工作?我正在使用python 3.6.3和numpy 1.13.3。 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
答案 0 :(得分:2)
我认为您正在寻找的是NumPy广播。
import numpy as np
x = np.array([[0, 1], [1, 1], [2, 2]])
rowsum = x.sum(axis=1)
x[rowsum <= 2]
给出:
array([[0, 1],
[1, 1]])
问题是您使用了keepdims=True
,这意味着总和会创建一个列向量,而不是可以广播的一级数组。
答案 1 :(得分:2)
从Numpy 11开始,它与新的默认行为不兼容:(boolean-indexing-changes):
布尔索引更改。
...
...
- 布尔索引必须与轴的维度匹配 他们索引。
- ...
内部已经过优化,文档还没有......