我有一个形状为(4, 3, 20)
的张量。当我X[:, 0, :].shape
时,我得到(4, 20)
。当我X[:, [0,2,0,1], :].shape
时,我得到(4, 4, 20)
。
我所拥有的是表示张量的第二维的索引列表。我希望获得一个二维矩阵,就像我在X[:, 0, :]
时得到的那样,但我对第二维有不同的索引,而不是只有一个。我该怎么做?
答案 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)