numpy数组-使用reshape

问题描述

我想将n列数作为新行堆叠在数组的末尾。我试图通过重塑来做到这一点,但我做不到。例如给出的表格

table = np.array([[11,12,13,14,15,16],[21,22,23,24,25,26],[31,32,33,34,35,36],[41,42,43,44,45,46]])

如果n=2应该是我的输出

array([[11,12],22],32],42],[13,14],[23,24],[33,34],[43,44],[15,[25,[35,[45,46]])

,如果n=3

array([[11,13],23],33],43],[14,[24,25. 26],[34,[44,46]])

更新:

好的,我通过以下命令设法达到了想要的结果:

import numpy as np

n=2
np.concatenate(np.split(table,table.shape[1]/n,axis=1),axis=0)
n=3
np.concatenate(np.split(table,axis=0)

我不知道是否可以通过整形来完成。

解决方法

OP提供了一种解决方案:

np.concatenate(np.split(table,table.shape[1]/n,axis=1),axis=0)

它似乎效率不高,因为np.split强制将数据更改为数组列表,然后在外部参数中对其进行迭代。不仅np.concatenate还不够高效。当列表项的长度不平衡时,它们是理想的工作方式。

我的解决方案如下:

np.vstack(table.reshape(4,3,2).swapaxes(0,1))
#np.vstack(table.reshape(4,2,3).swapaxes(0,1)) #for second case

让我们检查一下我对表现的预测是否正确:

%timeit np.vstack(table.reshape(4,1))
%timeit np.concatenate(np.split(table,table.shape[1]/2,axis=0)

输出:

22.4 µs ± 2.72 µs per loop (mean ± std. dev. of 7 runs,100000 loops each)
42.8 µs ± 9.09 µs per loop (mean ± std. dev. of 7 runs,10000 loops each)

我一直在numpyviz的帮助下寻求解决方案(免责声明:我是它的作者)。 numpyviz的个性化有助于更好地理解流程:

enter image description here

通常,您需要设置形状以使块保留宽度和高度。 Numpyviz归一化暗示新形状的axis=0axis=2分别对应于table.shape[0]n。同样,中轴的长度是table.shape[1]\\n的多个块。因此,您可以像这样传递参数:

table.reshape(table.shape[0],table.shape[1]\\n,n)

或什至以更简单的方式:

table.reshape(table.shape[0],-1,n)