是否有一种减少阵列的numpy方法?

时间:2017-09-28 16:32:07

标签: python arrays numpy

我有这个numpy数组,它是其他numpy数组的连接

array([array([[ 0.,  1.,  0.,  0.,  1.,  0.]]),
       array([[ 1.,  0.,  0.,  1.,  0.,  0.]]),
       array([[ 0.,  0.,  0.,  0.,  1.,  1.]]),
       array([[ 0.,  1.,  0.,  0.,  0.,  1.]]),
       array([[ 0.,  1.,  0.,  1.,  0.,  0.]]),
       array([[ 1.,  0.,  0.,  0.,  0.,  1.]])], dtype=object)

其当前形状为(6,)。我想要的是形状(6,6)

array([[ 0.,  1.,  0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  1.],
       [ 0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  1.]], dtype=object)

有没有一种解决这个问题的方法,还是我必须遍历数组并附加它?

2 个答案:

答案 0 :(得分:1)

你应该试试这个:

my_array = my_array.reshape(6,6)

按原样粘贴上面的数组,因为它会删除第三个维度。上面的@Divikar评论中显示的其他方法,如vstack和concatenate也可以用于此目的

答案 1 :(得分:1)

如果显示是准确的,并且数组确实是(6,),那么我们必须重新创建它:

In [27]: array=np.array
In [28]: alist = [array([[ 0.,  1.,  0.,  0.,  1.,  0.]]),
    ...:        array([[ 1.,  0.,  0.,  1.,  0.,  0.]]),
    ...:        array([[ 0.,  0.,  0.,  0.,  1.,  1.]]),
    ...:        array([[ 0.,  1.,  0.,  0.,  0.,  1.]]),
    ...:        array([[ 0.,  1.,  0.,  1.,  0.,  0.]]),
    ...:        array([[ 1.,  0.,  0.,  0.,  0.,  1.]])]
    ...:        
In [29]: A = np.empty((6,),object)
In [30]: A
Out[30]: array([None, None, None, None, None, None], dtype=object)
In [31]: A[:]=alist
In [32]: A
Out[32]: 
array([array([[ 0.,  1.,  0.,  0.,  1.,  0.]]),
       array([[ 1.,  0.,  0.,  1.,  0.,  0.]]),
       array([[ 0.,  0.,  0.,  0.,  1.,  1.]]),
       array([[ 0.,  1.,  0.,  0.,  0.,  1.]]),
       array([[ 0.,  1.,  0.,  1.,  0.,  0.]]),
       array([[ 1.,  0.,  0.,  0.,  0.,  1.]])], dtype=object)

reshape不起作用:

In [33]: A.reshape(6,6)
...
ValueError: cannot reshape array of size 6 into shape (6,6)

但是可以将数组视为列表,并将其赋予concatenate

In [34]: np.concatenate(A, axis=1)
Out[34]: 
array([[ 0.,  1.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,
         0.,  0.,  0.,  1.,  1.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  1.,
         0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
In [35]: np.concatenate(A, axis=0)
Out[35]: 
array([[ 0.,  1.,  0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  1.],
       [ 0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  1.]])

列表上的连接也同样适用:np.concatenate(alist, axis=0)

我应该注意,生成的数组是dtype float,而不是object。它可以用astype转换,但是谁想要呢?

简单的copy-n-paste产生一个3d数组,因为外部array忽略了内部分区并创建了一个高维数组:

In [37]: array([array([[ 0.,  1.,  0.,  0.,  1.,  0.]]),
    ...:        array([[ 1.,  0.,  0.,  1.,  0.,  0.]]),
    ...:        array([[ 0.,  0.,  0.,  0.,  1.,  1.]]),
    ...:        array([[ 0.,  1.,  0.,  0.,  0.,  1.]]),
    ...:        array([[ 0.,  1.,  0.,  1.,  0.,  0.]]),
    ...:        array([[ 1.,  0.,  0.,  0.,  0.,  1.]])])       
Out[37]: 
array([[[ 0.,  1.,  0.,  0.,  1.,  0.]],

       [[ 1.,  0.,  0.,  1.,  0.,  0.]],
        ...
       [[ 1.,  0.,  0.,  0.,  0.,  1.]]])
In [38]: _.shape
Out[38]: (6, 1, 6)

所以我们需要注意如何重新创建这样的案例。