[英]How to convert [numpy.ndarray of ndarrays] to one ndarray of numbers
我不知何故得到了以下类型的奇怪的嵌套 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)
。
我真的很感谢你的帮助。
所需的 Output:
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 识别为 object 几乎没有办法将其视为数字。
我的兴趣是是否有一种简单的方法来进行转换。 如果没有,我最好编辑我的代码以避免这种情况发生。
为确保我们拥有相同的东西,您可以运行
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.')
就这么简单:
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)
一种解决方案是使用 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)
我可以使用以下方法重新创建您的数组:
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
是将 arrays 合二为一的好方法。 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]])
我没有简单地复制粘贴原始数组的原因是它会跳过 object 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
等什么都不做,因为 object dtype 形状是 (9,),而不是任何可以重塑为 (9,2) 的东西。 您必须认真对待 object dtype!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.