【问题标题】:Indexing the last dimension of a 3D array with a 2D integer array用 2D 整数数组索引 3D 数组的最后一维
【发布时间】:2015-08-11 07:13:24
【问题描述】:

我有一个 3D data = NxMxD numpy 数组和另一个 2D idx = NxM 整数数组,其值在 [0, D-1] 的范围内。我想在该位置的idx 数组给定的深度对每个data = NxM 条目执行基本更新。

例如,对于N = M = D = 2

data = np.zeros((2,2,2))
idx = np.array([[0,0],[1, 1]], int)

我想执行一个简单的操作,例如:

data[..., idx] += 1

我的预期输出是:

>>> data
array([[[ 1.,  0.],
        [ 1.,  0.]],

       [[ 0.,  1.],
        [ 0.,  1.]]])

idx 为每个 2D 坐标指示应该更新哪个 D。上述操作无效。

我在 SO 中找到了this approach,它通过以下方式解决了索引问题:

data[np.arange(N)[:, None], np.arange(M)[None, :], idx] += 1

它工作正常,但看起来非常可怕,需要手动索引整个矩阵,这似乎是一个非常简单的操作(使用一个矩阵作为最后一个通道的索引掩码)。

有没有更好的解决方案?

【问题讨论】:

    标签: numpy indexing mask


    【解决方案1】:

    numpy.ix_ 看起来并不可怕,但使用花哨索引的基本思想仍然相同

    x = np.arange(N)
    y = np.arange(M)
    
    xx,yy = np.ix_(x,y)
    
    data[xx,yy,idx] += 1
    

    注意

    问题是您想更改data 的值。如果您只是想根据idx 获得值,您可以这样做

    out = np.choose(idx,data.transform(2,0,1))
    

    但是,这会为您提供data 值的副本,而不是视图,这意味着

    out += 1
    

    data 中的值没有影响。

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 2019-12-23
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2018-11-13
      • 2015-09-30
      • 2020-07-19
      • 2022-01-19
      相关资源
      最近更新 更多