我有一个np.array data形状(28,8,20),我只需要它的某些条目,所以我正在切片:
In [41]: index = np.array([ 5, 6, 7, 8, 9, 10, 11, 17, 18, 19])
In [42]: extract = data[:,:,index]
In [43]: extract.shape
Out[43]: (28, 8, 10)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,一切都应该如此.但是现在我只想看看第一行最后一个索引的前两个条目:
In [45]: extract[0,:,np.array([0,1])].shape
Out[45]: (2, 8)
Run Code Online (Sandbox Code Playgroud)
等等,应该是(8,2).它改变了指数,即使我最后一次切片时没有!根据我的理解,以下应采取相同的行动:
In [46]: extract[0,:,:2].shape
Out[46]: (8, 2)
Run Code Online (Sandbox Code Playgroud)
......但它给了我我想要的东西!但是,只要我有一个3D数组,这两种方法似乎都是等价的:
In [47]: extract[:,:,np.array([0,1])].shape
Out[47]: (28, 8, 2)
In [48]: extract[:,:,:2].shape
Out[48]: (28, 8, 2)
Run Code Online (Sandbox Code Playgroud)
那么,如果我不仅需要前两个条目而且需要不规则列表,我该怎么办?我当然可以在操作后转置矩阵,但这看起来非常违反直觉.我的问题的一个更好的解决方案是这个(虽然可能有一个更优雅的):
In [64]: extract[0][:,[0,1]].shape
Out[64]: (8, 2)
Run Code Online (Sandbox Code Playgroud)
这把我们带到了实际
我想知道这种行为的原因是什么?无论谁决定它应该如何工作,可能比我更了解编程,并认为这在某种程度上是一致的,我完全没有.除非我有办法理解它,否则我可能会继续关注这个问题.
我遇到了一个奇怪的问题:
from numpy import zeros, arange
aa = zeros([1, 3, 10])
aa[0, :, arange(5)].shape
Run Code Online (Sandbox Code Playgroud)
运行这个给了我(5,3),但我期待着(3,5)。
然而,运行以下命令给了我(3,5)预期的结果。
aa = zeros([3, 10])
aa[:, arange(5)]
Run Code Online (Sandbox Code Playgroud)
作为我的程序的一部分,这很容易修复,但它完全毁了我的信念。
我试图搜索已经回答的类似问题,但不知道要搜索什么。
谢谢您,祝您农历新年快乐!