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

时间:2016-04-30 16:35:10

标签: python numpy

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

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

2 个答案:

答案 0 :(得分: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]])

从第1架飞机上挑选第0行;第2行,第2行等。结果与X[:,0,:]形状相同,但是从不同的第一维平面拉出值。

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

答案 1 :(得分:0)

我认为您正在寻找np.squeeze。因此,对于索引列表,例如L只有一个元素并且使用它索引输入数组将导致3D数组具有单个第二维(维度长度为1)的情况,使用 squeezing 导致2D输出。对于具有多个元素的L,索引将导致3D数组没有任何单例维度,因此, squeezing ing 没有变化,因此所需的输出。因此,使用它的解决方案是 -

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)