重塑多维Numpy数组

时间:2017-10-15 11:48:52

标签: python numpy multidimensional-array

我有一个形状为(1429,1)的numpy数组,其中每一行本身都是一个形状为(3,100}的numpy数组,其中l可能因行而异。 如何通过展平每一行来重新整形此数组,以使得生成的numpy数组具有(1429, 300)形状?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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会丢弃不需要的尺寸。

答案 2 :(得分:0)

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

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

我使用arr.ravel(),因此数组看起来像stack的(1429)元素列表。然后stack连接元素,创建一个(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=0np.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]])