2017-10-15 182 views
1

我有一个形状(1429,1)形状的numpy数组,其中每一行本身是一个形状为(3,100)的numpy数组,其中l可能因行而异。 如何通过展平每行来重塑这个数组,使得生成的numpy数组的形状为(1429, 300)重塑一个多维Numpy阵列

+0

向我们展示你的最小的和可核查的例子 – Chiel

回答

2

我猜您最初的数组的形状(1429,3,100),如果这是真的,你可以改变它的形状如下:

import numpy as np 
a = a.flatten().reshape((1429, 300)) #a is the initial numpy array 
2

类型的嵌接结构大概是object.这只是一个收集参考资料1429 numpy.ndarrays

作为为例:

a=np.empty((1429,1),object) 
for x in a : 
    x[0]=np.random.rand(3,100) 


In [19]: a.shape,a.dtype 
Out[19]: ((1429, 1), dtype('O')) 

In [20]: a[0,0].shape 
Out[20]: (3, 100) 

结构可能是不连续的。要获得包含所有数据块,你必须重建它,以获得良好的布局:

b=np.array([x.ravel() for x in a.ravel()]) 

In [21]: b.shape 
Out[21]: (1429, 300) 

ravel丢弃不符合尺寸。

0

假设它是一个具有形状(1429,1)的对象dtype数组,并且所有元素都是形状为2d的形状(3,100),“平坦”的一个好方法是使用concatenatestack

np.stack(arr.ravel()).reshape(-1,300) 

我使用arr.ravel()以使阵列看起来像一个(1429)元素列表stackstack然后连接元素,创建一个(1429,3,100)数组。重塑然后将其转换为(1429,300)。

In [939]: arr = np.empty((5,1),object) 
In [940]: arr[:,0] = [np.arange(6).reshape(2,3) for _ in range(5)] 
In [941]: arr 
Out[941]: 
array([[array([[0, 1, 2], 
     [3, 4, 5]])], 
     [array([[0, 1, 2], 
     [3, 4, 5]])], 
     [array([[0, 1, 2], 
     [3, 4, 5]])], 
     [array([[0, 1, 2], 
     [3, 4, 5]])], 
     [array([[0, 1, 2], 
     [3, 4, 5]])]], dtype=object) 
In [942]: np.stack(arr.ravel()) 
Out[942]: 
array([[[0, 1, 2], 
     [3, 4, 5]], 

     [[0, 1, 2], 
     [3, 4, 5]], 

     [[0, 1, 2], 
     [3, 4, 5]], 

     [[0, 1, 2], 
     [3, 4, 5]], 

     [[0, 1, 2], 
     [3, 4, 5]]]) 
In [943]: np.stack(arr.ravel()).reshape(-1,6) 
Out[943]: 
array([[0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5]]) 

np.stack使用默认axis=0相同np.array(...)

或用concatenate

In [950]: np.concatenate(arr.ravel(),axis=0) 
Out[950]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [0, 1, 2], 
     [3, 4, 5], 
     [0, 1, 2], 
     [3, 4, 5], 
     [0, 1, 2], 
     [3, 4, 5], 
     [0, 1, 2], 
     [3, 4, 5]]) 
In [951]: np.concatenate(arr.ravel(),axis=0).reshape(5,6) 
Out[951]: 
array([[0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5]])