Python在numpy数组中展平数组

时间:2017-08-17 15:47:59

标签: python arrays numpy

我有一个非常愚蠢的问题,但由于某种原因,我无法弄清楚该怎么做。我有一个多维的numpy数组,应该有以下形状:

(345138,30,300)

然而,它实际上有这样的形状:

(345138,1)

1元素数组中的

是包含形状

的数组

(30,300)

那我该如何移动"内部数组,以便形状正确吗?

目前它看起来像这样:

$(".button").click(function() {   
    $(".visible_div").addClass("hide");
});

$(".visible_div").on('transitionend', function() {
    $(".invisible_div").addClass("show");
});

但是我希望没有数组(...),dtype = 32并将其中的内容移动到第一个数组中,以便形状为(345138,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],
   ..., 

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

看起来你有一个包含2d数组的二维数组(对象dtype)。我可以用以下方法构建一个:

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)