生成包含另一个NumPy数组索引的NumPy数组

时间:2018-07-11 21:09:01

标签: python arrays numpy indices

我想为另一个NumPy数组的给定形状生成一个np.ndarray NumPy数组。前一个数组应为后一个数组的每个单元格包含相应的索引。

示例1

假设我们有a = np.ones((3,)),其形状为(3,)。我希望

[[0]
 [1]
 [2]]

因为a[0]中有a[1]a[2]a,可以通过它们的索引01和{{ 1}}。

示例2

对于2这样的(3, 2)形状,已经有很多东西要写。我希望

b = np.ones((3, 2))

因为[[[0 0] [0 1]] [[1 0] [1 1]] [[2 0] [2 1]]] 中有6个单元格,第一行的相应索引bb[0][0]b[0][1]的{​​{1}}可以访问第二行,b[1][0],第三行b[1][1]。因此,我们在生成的数组中的匹配位置处得到b[2][0]b[2][1][0 0][0 1][1 0][1 1]

非常感谢您抽出宝贵的时间。让我知道我是否可以以任何方式澄清这个问题。

1 个答案:

答案 0 :(得分:4)

使用np.indicesnp.stack的一种方法:

np.stack(np.indices((3,)), -1)

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

np.stack(np.indices((3,2)), -1)

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

np.indices返回一个索引网格数组,其中每个子数组代表一个轴:

np.indices((3, 2))

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

然后用np.stack转置数组,从不同的轴为每个元素堆叠索引:

np.stack(np.indices((3,2)), -1)

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