获取数组的索引数组

3
如果我有一个多维数组,就像这样:
a = np.array([[9,9,9],[9,0,9],[9,9,9]])

我希望能够得到一个数组,其中包含原数组中每个元素的索引,如下所示:
i = np.array([[0,0],[0,1],[0,2],[1,0],[1,1],...])

我发现一种做法是使用 np.indices,具体如下:

i = np.transpose(np.indices(a.shape)).reshape(a.shape[0] * a.shape[1], 2)

但这似乎有些笨拙,特别是考虑到np.nonzero的存在,它几乎可以做我想要的。

是否有内置的numpy函数可以生成一个包含2D numpy数组中每个项索引的数组?


我突然想到的另一种方法是np.transpose(np.nonzero(a == a)),但这几乎比使用indicesreshape更奇怪。 - squirl
1个回答

3
这里有一种更简洁的方法(如果顺序不重要):
In [56]: np.indices(a.shape).T.reshape(a.size, 2)
Out[56]: 
array([[0, 0],
       [1, 0],
       [2, 0],
       [0, 1],
       [1, 1],
       [2, 1],
       [0, 2],
       [1, 2],
       [2, 2]])

如果您想按照预期的顺序排列,可以使用dstack

In [46]: np.dstack(np.indices(a.shape)).reshape(a.size, 2)
Out[46]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])

如果您不想使用reshape的第一种方法是沿着第一个轴连接,可以使用np.concatenate()

np.concatenate(np.indices(a.shape).T)

1
索引的顺序并不重要,我猜我会选择第一个。谢谢! - squirl
第一个并不是真正可行的。请在 a = np.zeros((2, 2)) 上尝试。 - Paul Panzer
实际上,在(3,3)的例子中,您可以看到(1,2)出现了两次,而(2,1)则缺失。 - Paul Panzer
嗯...好主意。也许我会使用 np.transpose(np.indices(a.shape)).reshape(a.size, 2) 代替。 - squirl
1
@Samadi Noe只需要在两个方法中间加入一个“T”。 - Mazdak
@PaulPanzer 是的,实际上这是从终端复制粘贴时犯的错误。不过还是谢谢你提醒我。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接