首页 文章

Python使用较小的布尔数组索引numpy数组

提问于
浏览
2

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 .
enter image description here

2 回答

  • 1

    从Numpy 11开始,它与新的默认行为不兼容:(boolean-indexing-changes):

    布尔索引更改 . ......布尔索引必须与它们索引的轴的维度相匹配 . ...

    内部已经优化,文档尚未....

  • 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 ,这意味着sum会创建一个列向量,而不是一个可以广播的一级数组 .

相关问题