https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
如果obj.ndim == x.ndim,x [obj]返回一个1维数组,该数组填充了与obj的True值对应的x元素 . 搜索顺序为行主,C风格 . 如果obj在x的边界之外的条目处具有True值,则将引发索引错误 . 如果obj小于x,则与填充False相同 .
我从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 .
2 回答
从Numpy 11开始,它与新的默认行为不兼容:(boolean-indexing-changes):
内部已经优化,文档尚未....
我想你正在寻找的是NumPy广播 .
得到:
问题是你使用了
keepdims=True
,这意味着sum会创建一个列向量,而不是一个可以广播的一级数组 .