在Matlab中,我可以执行以下操作:
X = randn(25,25,25);
size(X(:,:))
ans =
25 625
我经常发现自己想要快速折叠数组的尾随维度,并且不知道如何在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)
但x.reshape(x.shape[:-2] + (-1,))
lot 简洁(并且需要有关x
的更多信息),而不仅仅是x(:,:)
。
我显然尝试过类似的numpy索引,但这并不能按预期工作:
In [25]: x = np.random.randn(25,25,25)
In [26]: x[:,:].shape
Out[26]: (25, 25, 25)
有关如何以简洁的方式折叠数组尾随尺寸的任何提示?
编辑:请注意我在生成的数组本身之后,而不仅仅是它的形状。我只是在上面的示例中使用size()
和x.shape
来表示数组是什么样的。
答案 0 :(得分:3)
4d或更高时应该发生什么?
octave:7> x=randn(25,25,25,25);
octave:8> size(x(:,:))
ans =
25 15625
您的(:,:)
将其缩小为2维,并将最后的维度合并。最后一个维度是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)
你的reshape
示例与MATLAB有所不同,它只是折叠了最后的2个。将它折叠到2个维度,如MATLAB是一个更简单的表达式。
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)
等效的MATLAB是什么?
octave:24> size(reshape(x,[],size(x)(2:end)))
ans =
15625 25
octave:31> size(reshape(x,[],prod(size(x)(3:end))))
答案 1 :(得分:1)
您可以使用np.hstack
:
>>> np.hstack(x).shape
(25, 625)
np.hstack
ake一系列数组并将它们水平堆叠以形成一个数组。
答案 2 :(得分:1)
您可能会发现直接修改shape
属性更简洁一些。例如:
import numpy as np
x = np.random.randn(25, 25, 25)
x.shape = x.shape[0], -1
print x.shape
print x
这在功能上等同于reshape
(在数据排序等方面)。显然,它仍然需要有关x
形状的相同信息,但它是一种处理重塑的更简洁的方法。