数组中所有值的索引

Indices of all values in an array

我有一个矩阵A。我想生成该矩阵中所有值的索引。

A=np.array([[1,2,3],[4,5,6],[7,8,9]])

所需的输出应如下所示:

[(0,0),(0,1),(0,2),(1,0),(1,1),(2,1),(2,0),(2,1),(2,2)]

您可以使用:

from itertools import product
list(product(*map(range, A.shape)))

这输出:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

解释:

A.shape 给出数组的维度。对于每个维度,我们创建一个 range() 来生成 0 和给定维度长度之间的所有数字。我们使用 map() 对数组的每个维度执行此操作。最后,我们将所有这些范围解压缩到 itertools.product() 的参数中,以在所有这些范围中创建笛卡尔积。

值得注意的是,使用列表解包和 map() 意味着这种方法可以处理具有任意维数的 ndarray。在发布此答案时,所有其他答案都无法立即扩展到非二维数组。

这应该有效。

indices = []
for i in range(len(A)):
    for j in range(len(A[i])):
        indices.append((i,j))

这行列表理解有效。它可能不如使用 itertools 快,但它确实有效。

[(i,j) for i in range(len(A)) for j in range(len(A[i]))]

这是一种使用 itertools 组合的方法

from itertools import combinations
sorted(set(combinations(tuple(range(A.shape[0])) * 2, 2)))

combinations 从列表中选择两个元素并将它们配对,这会导致重复,因此将其转换为 set 以删除重复项,然后对其进行排序。

只有使用numpy才能利用ndindex

list(np.ndindex(A.shape))

unravel_index:

list(zip(*np.unravel_index(np.arange(A.size), A.shape)))

输出:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

注意。第二个选项使您能够传递 order='C' (row-major) 或 order='F' (column-major) 参数以获得不同顺序的坐标

示例 A = np.array([[1,2,3],[4,5,6]])

order='C'(默认):

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

order='F':

[(0, 0), (1, 0), (0, 1), (1, 1), (0, 2), (1, 2)]