数组中所有值的索引
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))
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)]
我有一个矩阵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))
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)]