Python Numpy:从给定索引列表的张量中获取矩阵

Python Numpy:从给定索引列表的张量中获取矩阵,python,numpy,Python,Numpy,我有一个形状为(4,3,20)的张量。当我做X[:,0,:].shape时,我得到(4,20)。当我做X[:,[0,2,0,1],:].shape时,我得到(4,4,20) 我有一个索引列表,代表我的张量的第二维度。我想得到一个二维矩阵,就像我做X[:,0,:]时得到的那样,但是我对第二个维度有不同的索引,而不是只有一个索引。我该怎么做?你的问题不清楚,但我会猜一猜 In [58]: X=np.arange(24).reshape(4,3,2) In [59]: X[range(4),[0,2

我有一个形状为
(4,3,20)
的张量。当我做
X[:,0,:].shape时,我得到
(4,20)
。当我做
X[:,[0,2,0,1],:].shape时,我得到
(4,4,20)


我有一个索引列表,代表我的张量的第二维度。我想得到一个二维矩阵,就像我做
X[:,0,:]
时得到的那样,但是我对第二个维度有不同的索引,而不是只有一个索引。我该怎么做?

你的问题不清楚,但我会猜一猜

In [58]: X=np.arange(24).reshape(4,3,2)

In [59]: X[range(4),[0,2,0,1],:]
Out[59]: 
array([[ 0,  1],
       [10, 11],
       [12, 13],
       [20, 21]])
这将从第一个平面拾取行0;第2行的第2行,以此类推。结果的形状与
X[:,0,:]
相同,但值是从不同的第1维平面提取的

In [61]: X[:,0,:]
Out[61]: 
array([[ 0,  1],   # same
       [ 6,  7],
       [12, 13],   # same
       [18, 19]])

我想你在找我。因此,对于索引列表(例如
L
只有一个元素)的情况,使用它对输入数组进行索引时,将产生一个具有单一第二维度(长度为1的维度)的
3D
数组,将产生具有该挤压的
2D
输出。对于具有多个元素的
L
,索引将导致
3D
数组,没有任何单态维度,因此,挤压不会发生任何变化,因此也不会产生所需的输出。因此,它的解决方案是-

np.squeeze(X[:,L,:])
在随机数组上测试形状的示例运行-

In [25]: A = np.random.rand(4,3,20)

In [26]: L = [0]

In [27]: np.squeeze(A[:,L,:]).shape
Out[27]: (4, 20)

In [28]: L = [0,2,0,1]

In [29]: np.squeeze(A[:,L,:]).shape
Out[29]: (4, 4, 20)