Eel*_*aak 6 python arrays numpy multidimensional-array
在Matlab中,我可以执行以下操作:
X = randn(25,25,25);
size(X(:,:))
ans =
25 625
Run Code Online (Sandbox Code Playgroud)
我经常发现自己想要快速折叠数组的尾随维度,并且不知道如何在numpy中执行此操作.
我知道我可以这样做:
In [22]: x = np.random.randn(25,25,25)
In [23]: x = x.reshape(x.shape[:-2] + (-1,))
In [24]: x.shape
Out[24]: (25, 625)
Run Code Online (Sandbox Code Playgroud)
但x.reshape(x.shape[:-2] + (-1,))是很多简洁的少(和需要更多的信息x),比简单地做x(:,:).
我显然尝试过类似的numpy索引,但这并不能按预期工作:
In [25]: x = np.random.randn(25,25,25)
In [26]: x[:,:].shape
Out[26]: (25, 25, 25)
Run Code Online (Sandbox Code Playgroud)
有关如何以简洁的方式折叠数组的尾随尺寸的任何提示?
编辑:请注意,我在生成的数组本身之后,而不仅仅是它的形状.我只是用size()和x.shape在上面的例子中,表示该阵列是什么样的.
4d 或更高版本会发生什么?
octave:7> x=randn(25,25,25,25);
octave:8> size(x(:,:))
ans =
25 15625
Run Code Online (Sandbox Code Playgroud)
你(:,:)将它减少到二维,并结合最后一个维度。最后一个维度是 MATLAB 自动添加和折叠维度的位置。
In [605]: x=np.ones((25,25,25,25))
In [606]: x.reshape(x.shape[0],-1).shape # like Joe's
Out[606]: (25, 15625)
In [607]: x.reshape(x.shape[:-2]+(-1,)).shape
Out[607]: (25, 25, 625)
Run Code Online (Sandbox Code Playgroud)
您的reshape示例执行的操作与 MATLAB 不同,它只是折叠最后 2 个维度。像 MATLAB 一样将其折叠为 2 维是一个更简单的表达式。
MATLAB 之所以简洁,是因为您的需求符合它的假设。等价numpy的不是那么简洁,但给你更多的控制权
例如,保留最后一个维度,或将 2 乘 2 的维度组合起来:
In [608]: x.reshape(-1,x.shape[-1]).shape
Out[608]: (15625, 25)
In [610]: x.reshape(-1,np.prod(x.shape[-2:])).shape
Out[610]: (625, 625)
Run Code Online (Sandbox Code Playgroud)
等效的 MATLAB 是什么?
octave:24> size(reshape(x,[],size(x)(2:end)))
ans =
15625 25
octave:31> size(reshape(x,[],prod(size(x)(3:end))))
Run Code Online (Sandbox Code Playgroud)