我有一个形状为(1429,1)
的numpy数组,其中每一行本身都是一个形状为(3,100
}的numpy数组,其中l可能因行而异。
如何通过展平每一行来重新整形此数组,以使得生成的numpy数组具有(1429, 300)
形状?
答案 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),这是一个很好的方法来展平'是使用concatenate
或stack
。
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=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]])