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

Python 生成包含另一个NumPy数组索引的NumPy数组,python,arrays,numpy,indices,Python,Arrays,Numpy,Indices,我想为另一个NumPy数组的给定形状生成一个np.ndarrayNumPy数组。前一个数组应包含后一个数组中每个单元格的相应索引 示例1 假设我们有a=np.one((3,),它的形状是(3,)。我想 [[0] [1] [2]] [[[0 0] [0 1]] [[1 0] [1 1]] [[2 0] [2 1]]] 因为a中有a[0]、a[1]和a[2],可以通过它们的索引0、1和2来访问它们 示例2 对于(3,2)的形状,比如b=np.ones((3,2))已经有很

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

示例1

假设我们有
a=np.one((3,)
,它的形状是
(3,)
。我想

[[0]
 [1]
 [2]]
[[[0 0]
  [0 1]]

 [[1 0]
  [1 1]]

 [[2 0]
  [2 1]]]
因为
a
中有
a[0]
a[1]
a[2]
,可以通过它们的索引
0
1
2
来访问它们

示例2

对于
(3,2)
的形状,比如
b=np.ones((3,2))
已经有很多东西要写了。我想

[[0]
 [1]
 [2]]
[[[0 0]
  [0 1]]

 [[1 0]
  [1 1]]

 [[2 0]
  [2 1]]]
由于
b
中有6个单元格,可通过相应的索引
b[0][0]
访问,因此第一行为
b[0][1]
,第二行为
b[1][1]
b[2][0]
,第三行为
b[2][1]
。因此,我们在生成的数组中的匹配位置获得
[0 0]
[0 1]
[1]
[2 0]
[2 1]


非常感谢您抽出时间。请告诉我是否可以以任何方式澄清问题。

使用
np.index
np.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.index
返回索引网格数组,其中每个子数组表示一个轴:

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]]])

使用
np.index
np.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.index
返回索引网格数组,其中每个子数组表示一个轴:

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]]])

第一个数组具有形状
(3,1)
,第二个数组具有形状
(3,2,2)
。你如何从
(3,)
(3,1)
以及从
(3,2)
(3,2,2)
?此外,什么决定了结果数组的内容?如果输入是,比如说,
(4,1)
,或者
(4,3,2)
,您会期望什么?@fuglede感谢您的评论。我试图进一步澄清这个问题。关于您在评论中提出的问题:
(3,)
导致
(3,1)
,因为有3个单元格可以被1个索引访问-
(3,2)
导致
(3,2,2)
,因为有6个单元格形成3行2列,每个2个索引都可以唯一地访问它们。因此,首先,生成的数组与输入数组具有相同的形状-加上索引数量的一个额外维度<因此,代码>(4,1)将导致
(4,1,2)
(4,3,2)
将导致
(4,3,2,3)
。我希望这有帮助?:-)是的,这更清楚了,谢谢。在这种情况下,提供的答案似乎就是你想要的?@fuglede是的,我也这么认为。只是想澄清一下,以防你有其他想法或答案。:-)第一个数组具有形状
(3,1)
,第二个数组具有形状
(3,2,2)
。你如何从
(3,)
(3,1)
以及从
(3,2)
(3,2,2)
?此外,什么决定了结果数组的内容?如果输入是,比如说,
(4,1)
,或者
(4,3,2)
,您会期望什么?@fuglede感谢您的评论。我试图进一步澄清这个问题。关于您在评论中提出的问题:
(3,)
导致
(3,1)
,因为有3个单元格可以被1个索引访问-
(3,2)
导致
(3,2,2)
,因为有6个单元格形成3行2列,每个2个索引都可以唯一地访问它们。因此,首先,生成的数组与输入数组具有相同的形状-加上索引数量的一个额外维度<因此,代码>(4,1)将导致
(4,1,2)
(4,3,2)
将导致
(4,3,2,3)
。我希望这有帮助?:-)是的,这更清楚了,谢谢。在这种情况下,提供的答案似乎就是你想要的?@fuglede是的,我也这么认为。只是想澄清一下,以防你有其他想法或答案。:-)