python - 使用 2D 矩阵作为 numpy 中 3D 矩阵的索引?

标签 python numpy matrix

假设我有一个形状为 2x3x3 的数组,它是一个 3D 矩阵。我还有一个形状为 3x3 的 2D 矩阵,我想将其用作沿第一个轴的 3D 矩阵的索引。示例如下。

运行示例:

>>> np.random.randint(0,2,(3,3)) # index
array([[0, 1, 0],
       [1, 0, 1],
       [1, 0, 0]])

>> np.random.randint(0,9,(2,3,3)) # 3D matrix
array([[[4, 4, 5],
        [2, 6, 7],
        [2, 6, 2]],

       [[4, 0, 0],
        [2, 7, 4],
        [4, 4, 0]]])
>>> np.array([[4,0,5],[2,6,4],[4,6,2]]) # result
array([[4, 0, 5],
       [2, 6, 4],
       [4, 6, 2]])

最佳答案

您似乎正在使用 2D 数组作为索引数组,并使用 3D 数组来选择值。因此,您可以使用 NumPy 的 advanced-indexing -

# a : 2D array of indices, b : 3D array from where values are to be picked up
m,n = a.shape
I,J = np.ogrid[:m,:n]
out = b[a, I, J] # or b[a, np.arange(m)[:,None],np.arange(n)]

如果您打算使用 a 索引到最后一个轴,只需将 a 移到那里:b[I, J, a].

sample 运行-

>>> np.random.seed(1234)
>>> a = np.random.randint(0,2,(3,3))
>>> b = np.random.randint(11,99,(2,3,3))
>>> a  # Index array
array([[1, 1, 0],
       [1, 0, 0],
       [0, 1, 1]])
>>> b  # values array
array([[[60, 34, 37],
        [41, 54, 41],
        [37, 69, 80]],

       [[91, 84, 58],
        [61, 87, 48],
        [45, 49, 78]]])
>>> m,n = a.shape
>>> I,J = np.ogrid[:m,:n]
>>> out = b[a, I, J]
>>> out
array([[91, 84, 37],
       [61, 54, 41],
       [37, 49, 78]])

关于python - 使用 2D 矩阵作为 numpy 中 3D 矩阵的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335535/

相关文章:

python - 创建数据框子集的散点图

python - 如何从一维数组中获得正确的波峰和波谷

image-processing - 这个 YUV420P 到 RGB 着色器的转换从何而来?

python - 如何从任意长度的列表中获取列?

python - 在文档分析中计算句子分数时应该计算重复词吗?

python - 如何在Elasticsearch中索引对象列表?

python - 如何隔离 python 'for loop' 中函数的计算以避免广播形状冲突?

python - 如何在 python 中创建具有多个列表/数组的数据框

c++ - 每当我运行 C++ 中的乘法矩阵代码时,它总是崩溃。不知道为什么

python - 雅虎财经 - 下载特定时间范围的历史数据