如何将[numpy.ndarray of ndarrays]转换为一个ndarray的数字。

问题描述 投票:0回答:1

我莫名其妙地得到了以下类型的奇怪的嵌套numpy数组。我想知道是否有什么方法可以把它转换为一个正常的数组(在输出中没有这些'数组')。

features
> array([array([1, 0]), array([2, 0]), array([3, 0]), array([4, 0]),
       array([5, 0]), array([6, 0]), array([7, 0]), array([8, 0]),
       array([9, 0])], dtype=object)

features.reshape((9,1))
> array([[array([1, 0])],
       [array([2, 0])],
       [array([3, 0])],
       [array([4, 0])],
       [array([5, 0])],
       [array([6, 0])],
       [array([7, 0])],
       [array([8, 0])],
       [array([9, 0])]], dtype=object)

features.flatten()
> array([array([1, 0]), array([2, 0]), array([3, 0]), array([4, 0]),
       array([5, 0]), array([6, 0]), array([7, 0]), array([8, 0]),
       array([9, 0])], dtype=object)

features.squeeze()
> array([array([1, 0]), array([2, 0]), array([3, 0]), array([4, 0]),
       array([5, 0]), array([6, 0]), array([7, 0]), array([8, 0]),
       array([9, 0])], dtype=object)

features.reshape((-1,2))
> ValueError: cannot reshape array of size 9 into shape (2)

这个问题很重要,因为它扰乱了数组的形状。比如说

features.shape
> (9,)

虽说 (9,2).

我真的很感谢你的帮助。

希望的输出。

features
> array([[1, 0],
       [2, 0],
       [3, 0],
       [4, 0],
       [5, 0],
       [6, 0],
       [7, 0],
       [8, 0],
       [9, 0]], dtype=int32)

features.ndim
> 2

features.shape
> (9,2)

更新:@MaxNoe的评论指出了我的错误,即数组不是矩形的。但是,在我通过调试终端纠正了这个错误之后,我仍然无法轻松地将数组转换为dtype=int32。看来,一旦numpy识别ndarray为对象,就很难再把它当作数字来处理了。

我感兴趣的是,是否有一个简单的方法来进行转换。如果没有,我最好编辑一下我的代码,避免这种情况的发生。

为了确保我们有相同的东西,你可以运行

import pickle
features = pickle.loads(b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x04K\x02\x86q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00O8q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00|q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?tq\x0cb\x89]q\r(h\x00h\x01K\x00\x85q\x0eh\x03\x87q\x0fRq\x10(K\x01K\x02\x85q\x11h\x07X\x02\x00\x00\x00i4q\x12K\x00K\x01\x87q\x13Rq\x14(K\x03X\x01\x00\x00\x00<q\x15NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x16b\x89C\x08\x01\x00\x00\x00\x00\x00\x00\x00q\x17tq\x18bh\x00h\x01K\x00\x85q\x19h\x03\x87q\x1aRq\x1b(K\x01K\x02\x85q\x1ch\x14\x89C\x08\x02\x00\x00\x00\x00\x00\x00\x00q\x1dtq\x1ebh\x00h\x01K\x00\x85q\x1fh\x03\x87q Rq!(K\x01K\x02\x85q"h\x14\x89C\x08\x03\x00\x00\x00\x00\x00\x00\x00q#tq$bh\x00h\x01K\x00\x85q%h\x03\x87q&Rq\'(K\x01K\x02\x85q(h\x14\x89C\x08\x04\x00\x00\x00\x00\x00\x00\x00q)tq*bh\x00h\x01K\x00\x85q+h\x03\x87q,Rq-(K\x01K\x02\x85q.h\x14\x89C\x08\x05\x00\x00\x00\x00\x00\x00\x00q/tq0bh\x00h\x01K\x00\x85q1h\x03\x87q2Rq3(K\x01K\x02\x85q4h\x14\x89C\x08\x06\x00\x00\x00\x00\x00\x00\x00q5tq6bh\x00h\x01K\x00\x85q7h\x03\x87q8Rq9(K\x01K\x02\x85q:h\x14\x89C\x08\x08\x00\x00\x00\x00\x00\x00\x00q;tq<bh\x00h\x01K\x00\x85q=h\x03\x87q>Rq?(K\x01K\x02\x85q@h\x14\x89C\x08\t\x00\x00\x00\x00\x00\x00\x00qAtqBbetqCb.')
python numpy numpy-ndarray
1个回答
0
投票

我可以用你的数组重新创建。

In [126]: array=np.array                                                                               
In [127]: alist = [array([1, 0]), array([2, 0]), array([3, 0]), array([4, 0]), 
     ...:        array([5, 0]), array([6, 0]), array([7, 0]), array([8, 0]), 
     ...:        array([9, 0])]                                                                        
In [128]: len(alist)                                                                                   
Out[128]: 9
In [129]: arr = np.empty(9, dtype=object)                                                              
In [130]: arr[:]=alist                                                                                 
In [131]: arr                                                                                          
Out[131]: 
array([array([1, 0]), array([2, 0]), array([3, 0]), array([4, 0]),
       array([5, 0]), array([6, 0]), array([7, 0]), array([8, 0]),
       array([9, 0])], dtype=object)

np.stack 是一个很好的将数组连接成一个数组的方法。 np.vstack 也可以。

In [132]: np.stack(arr)                                                                                
Out[132]: 
array([[1, 0],
       [2, 0],
       [3, 0],
       [4, 0],
       [5, 0],
       [6, 0],
       [7, 0],
       [8, 0],
       [9, 0]])

我之所以没有简单地复制粘贴你的原始数组,是因为它会跳过对象dtype。

In [133]: np.array(alist)                                                                              
Out[133]: 
array([[1, 0],
       [2, 0],
       [3, 0],
       [4, 0],
       [5, 0],
       [6, 0],
       [7, 0],
       [8, 0],
       [9, 0]])

reshape, flattened 等什么都不做,因为对象dtype的形状是(9,),不是任何可以重塑成(9,2)的东西。 你必须认真对待对象dtype!


0
投票

就这么简单。

features = np.array([np.array([1, 0]), np.array([2, 0]), np.array([3, 0]), np.array([4, 0]),
   np.array([5, 0]), np.array([6, 0]), np.array([7, 0]), np.array([8, 0]),
   np.array([9, 0])], dtype=object)

features = np.reshape(features, (-1, 2)).astype('Int32')
print(features)
# output 
[[1 0]
 [2 0]
 [3 0]
 [4 0]
 [5 0]
 [6 0]
 [7 0]
 [8 0]
 [9 0]]

print(features.dtype) # int32
print(features.ndim)  # 2 
print(features.shape) # (9, 2)

0
投票

一个解决办法是用tolist然后再转换回来.

np.array(features.tolist(),dtype=np.int32)

我只能用一种奇怪的方式创建你的数组。

features = np.array([np.array([1, 0]), np.array([2, 0]), np.array([3, 0]), np.array([4, 0]),
                     np.array([5, 0]), np.array([6, 0]), np.array([7, 0]), np.array([8, 0]),
                     np.array([9])], dtype=object)
features[-1] = np.array([9,0])

>>>features

   array([array([1, 0]),
          array([2, 0]), array([3, 0]),
          array([4, 0]),
          array([5, 0]),
          array([6, 0]),
          array([7, 0]),
          array([8, 0]),
          array([9, 0])], dtype=object)

features = np.array(features.tolist(),dtype=np.int32)

>>>features
array([[1, 0],
       [2, 0],
       [3, 0],
       [4, 0],
       [5, 0],
       [6, 0],
       [7, 0],
       [8, 0],
       [9, 0]], dtype=int32)
© www.soinside.com 2019 - 2024. All rights reserved.