繁体   English   中英

有一种减少数组的方法吗?

[英]Is there a numpy way to reduce arrays?

我有这个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)

有没有解决这个问题的方法,还是我必须遍历数组并将其追加?

您应该尝试这样:

my_array = my_array.reshape(6,6)

按原样粘贴时,它可与上述数组配合使用,因为它将删除第三维。 如上面@Divikar注释所示,其他方法(例如vstack和concatenate)也应为此目的工作

如果显示准确,并且数组确实是(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)

因此,我们需要小心如何重新创建这样的案例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM