Python 在 numpy 数组中扁平化数组



我有一个非常愚蠢的问题,但由于某种原因,我不知道该怎么做。我有一个多维 numpy 数组,它应该具有以下形状:

(345138, 30, 300(

但是,它实际上具有以下形状:

(345138, 1(

1 元素数组内部是包含形状的数组

(30, 300(

那么如何"移动"内部数组,使形状正确呢?

目前它看起来像这样:

[[ array([[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
..., 
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]], dtype=int32)]
[ array([[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
..., 

但是我希望这个没有array(...(,dtype=32并将其中的内容移动到第一个数组中,以便形状为(345138,30,300(,如下所示:

[[ [0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
..., 
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[ [0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
..., 

有什么想法吗?

看起来您有一个包含 2d 数组(对象 dtype(的 2D 数组。 我可以用以下方法构建一个这样的:

In [972]: arr = np.empty(4,dtype=object)
In [973]: arr = np.empty((4,1),dtype=object)
In [974]: for i in range(4): arr[i,0]=np.ones((2,3),int)
In [975]: arr
Out[975]: 
array([[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])]], dtype=object)

简单地将其包装在np.array中是行不通的;应用tolist则不起作用:

In [976]: np.array(arr)
Out[976]: 
array([[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])],
[array([[1, 1, 1],
[1, 1, 1]])]], dtype=object)
In [977]: arr.tolist()
Out[977]: 
[[array([[1, 1, 1],
[1, 1, 1]])], [array([[1, 1, 1],
[1, 1, 1]])], [array([[1, 1, 1],
[1, 1, 1]])], [array([[1, 1, 1],
[1, 1, 1]])]]

"扁平化"的一种方法是使用某种版本的concatenate

In [978]: np.stack(arr.ravel())
Out[978]: 
array([[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]]])
In [979]: _.shape
Out[979]: (4, 2, 3)

我使用ravel将外部数组减少到 1d,stack可以将其用作列表。stack的行为类似于np.array,因为它将元素组合在新轴上(我们可以指定(。


tolistarray可以协同工作:

In [981]: np.array(arr.tolist())
Out[981]: 
array([[[[1, 1, 1],
[1, 1, 1]]],
[[[1, 1, 1],
[1, 1, 1]]],

[[[1, 1, 1],
[1, 1, 1]]],

[[[1, 1, 1],
[1, 1, 1]]]])
In [982]: _.shape
Out[982]: (4, 1, 2, 3)

或者tolistsqueeze(实际上是np.asarray(...).squeeze()(

In [983]: np.squeeze(arr.tolist())
Out[983]: 
array([[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]]])
In [984]: _.shape
Out[984]: (4, 2, 3)

最新更新