numpy - 使用 2D 整数数组索引 3D 数组的最后一个维度

标签 numpy indexing mask

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

例如,对于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。上面的操作不行。

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

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

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

有没有更好的解决办法?

最佳答案

使用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 值的副本,而不是 View ,这意味着

out += 1

数据中的值没有影响。

关于numpy - 使用 2D 整数数组索引 3D 数组的最后一个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30512313/

相关文章:

java - @Singleton @ApplicationScoped bean 中的 Lucene IndexWriters 关闭 IndexWriter

qt - 如何在qml中创建透视图像

python - 如何合并上三角形和下三角形,同时添加 1 的对角线

r - 索引操作删除属性

ios - 根据已排序的另一个数组的顺序调整一个数组的顺序

c++ - 如何在 C/C++ 中对字符串应用掩码?

Android 位图蒙版颜色,去除颜色

python - 如何在 Python 中加速矩阵乘法?

python numpy 矢量数学

python - 中心裁剪一个 numpy 数组