首页 > 解决方案 > 如何通过点坐标列表访问数组

问题描述

我有一个数组A = np.ones((4,4,4))和另一个数组,它们表示数组A中称为B的点的坐标,让我们假设B = [[2,2,2], [3,2,1]]

我试图通过像 A[B] 这样的数组索引来访问 A,但它不起作用。

我怎样才能以优雅的方式做到这一点,这也适用于 B ,它具有更高的尺寸,如 B 的形状 (10, 20, 3) ?

标签: pythonnumpy

解决方案


您可以传递坐标列表,但您应该转置该列表。这样第i个维度的项目作为索引中的第i个元素传递,例如:

A[tuple(np.transpose(B))]

对于 4×4×4 矩阵:

>>> A = np.arange(64).reshape(4,4,4)
>>> A
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23],
        [24, 25, 26, 27],
        [28, 29, 30, 31]],

       [[32, 33, 34, 35],
        [36, 37, 38, 39],
        [40, 41, 42, 43],
        [44, 45, 46, 47]],

       [[48, 49, 50, 51],
        [52, 53, 54, 55],
        [56, 57, 58, 59],
        [60, 61, 62, 63]]])

我们得到给定的坐标:

>>> A[tuple(np.transpose(B))]
array([42, 57])

如果我们手动计算这些,我们会得到:

>>> A[2,2,2]
42
>>> A[3,2,1]
57

背景

A[1,2,3]A[(1,2,3)](所以在一个元组中)的缩写。您可以获取多个项目,A[([2,3], [2,2], [2,1])]但您首先需要转置数据。

由于数据表示为[[2,2,2], [3,2,1]],因此我们首先需要将其转置[[2,3], [2,2], [2,1]]。接下来我们将它包装在一个元组中,并可以使用它来下标A


推荐阅读