【问题标题】:Numpy ndarray slicing with arraysNumpy ndarray 用数组切片
【发布时间】:2017-05-02 00:18:18
【问题描述】:

在尝试使用多个切片数组沿单独的维度切片 ndarray 时,我无法理解 numpy 广播错误背后的原因。 我正在尝试使用索引数组 picks 例如 np.arange(2, 306, 3) 和布尔数组 mask 沿第一维和第二维对 data ndarray (100, 306, 481) 进行切片,其中mask.shape 是 (481,) 其中 361 个元素是 True。

data[:, picks, mask] 返回

IndexError:形状不匹配:无法广播索引数组 连同形状 (102,) (361,)

但是,data[:, :, mask]、data[:, picks, :] 和 data[:, :10, mask] 按预期工作。

在这种情况下广播如何工作?什么是这样做的pythonic方式?

【问题讨论】:

  • 如果你想要一片形状(100, len(picks), len(mask)),你可以使用data[:, picks[:, np.newaxis], mask]。您不能广播具有(m,) 和(n,) 形状的数组,但可以使用(m, 1) 和(n,)。
  • 您可能还想检查函数 np.ix_ 。以上等价于data[np.ix_(arange(100), picks, mask)]。

标签: python arrays numpy indexing


【解决方案1】:

所以

data[:, :, mask]  => (100, 306, 361) 
data[:, :10, mask] => (100, 10, 361)
data[:, picks, :] => (100, 102, 481)

如果picks 有 (361,) 个元素,那么

data[:, picks, mask] => (100, 361)  # I think :)

想想picks匹配np.where(mask)

但是要在单独的维度中索引,picks 必须是列向量,因此 (102,1) 与 (1, 361) 一起广播以产生 (102,361) 选择

data[:, picks[:,None], mask] => (100, 102, 361) # again I need to test

所以创建一些测试数组:

In [253]: data=np.ones((100,306,481))
In [254]: picks=np.arange(2,306,3)
In [255]: mask=np.zeros(481,bool)
In [256]: mask[:361]=True
In [257]: data[:, picks[:,None],mask].shape
Out[257]: (100, 102, 361)

arange 可以用切片替换

In [259]: data[:, 2::3, mask].shape
Out[259]: (100, 102, 361)

ix_ 在这种情况下很方便

In [268]: I,J=np.ix_(picks,mask)
In [269]: I.shape
Out[269]: (102, 1)
In [270]: J.shape
Out[270]: (1, 361)
In [271]: data[:,I,J].shape
Out[271]: (100, 102, 361)

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多