折叠 numpy 数组尾随维度的简单方法



在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,))比简单地做x(:,:)要简洁得多(并且需要更多关于x的信息)。

我显然已经尝试了类似的numpy索引,但这并没有按预期工作:

In [25]: x = np.random.randn(25,25,25)
In [26]: x[:,:].shape
Out[26]: (25, 25, 25)

关于如何以简洁的方式折叠数组的尾随维度的任何提示?

编辑:请注意,我追求的是生成的数组本身,而不仅仅是它的形状。我只是在上面的例子中使用size()x.shape来指示数组是什么样的。

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 个。 像 MATLAB 一样将其折叠到 2 维是一个更简单的表达式。

MATLAB 简洁,因为您的需求与其假设相符。 numpy等效的不是那么简洁,但为您提供了更多控制

例如,要保留最后一个维度,或将维度 2 x 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))))
您可能会

发现直接修改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形状的相同信息,但它是处理重塑的更简洁的方法。

您可以使用np.hstack

>>> np.hstack(x).shape
(25, 625)

np.hstack数组序列并将它们水平堆叠以形成单个数组。

相关内容

  • 没有找到相关文章

最新更新