我有一个非常愚蠢的问题,但由于某种原因,我不知道该怎么做。我有一个多维 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
,因为它将元素组合在新轴上(我们可以指定(。
tolist
和array
可以协同工作:
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)
或者tolist
加squeeze
(实际上是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)