我有一个有点特殊的 python 列表列表结构,我需要将其转换为 numpy 数组,到目前为止,我已经成功地通过使用 np.array(myarray, dtype = object) 来简单地获得,但是对myarray 的结构导致我收到错误。
我已经设法将我的问题减少为两行代码,以下是我之前使用的代码,并且完全按照我想要的方式工作:
import numpy as np
myarray = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16],[17,18]])]
np.array(myarray,dtype = object)
但是,只需删除我们拥有的最后一个 [17,18] 数组
import numpy as np
myarray = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]
np.array(myarray,dtype = object)
当它尝试运行第二行时,会出现“ValueError:无法将输入数组从形状 (2,4) 广播到形状 (2,)”。
在我看来,只有当数组长度相同但底层列表长度不同时才会发生这种情况,我不明白的是为什么设置 dtype = object 不涵盖这一点,特别是考虑到它处理更复杂的列表列表形状。
np.array
首先尝试创建一个 n 维数字数组 - 所有元素都是数字,并且形状在所有维度上都是一致的。 即没有“参差不齐”的数组。
在[36]中:alist = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16],[17,18]])]
In [38]: [a.shape for a in alist]
Out[38]: [(2, 4), (2, 2), (3, 2)]
alist
可以制作一个 3 元素数组。
您的问题案例:
In [39]: blist = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]
In [40]: [a.shape for a in blist]
Out[40]: [(2, 4), (2, 2), (2, 2)]
请注意,所有子数组都具有相同的第一维。 这就是问题所在。
制作此类数组的安全方法是从正确形状的“虚拟”开始,然后填充它:
In [41]: res = np.empty(3,object); res[:] = blist; res
Out[41]:
array([array([[1, 2, 3, 4],
[5, 6, 7, 8]]), array([[ 9, 10],
[11, 12]]), array([[13, 14],
[15, 16]])],
dtype=object)
In [42]: res = np.empty(3,object); res[:] = alist; res
Out[42]:
array([array([[1, 2, 3, 4],
[5, 6, 7, 8]]), array([[ 9, 10],
[11, 12]]), array([[13, 14],
[15, 16],
[17, 18]])],
dtype=object)
当所有子数组/列表具有相同形状时它也适用
In [43]: clist = [np.array([[1,2],[7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]
In [44]: res = np.empty(3,object); res[:] = clist; res
Out[44]:
array([array([[1, 2],
[7, 8]]), array([[ 9, 10],
[11, 12]]), array([[13, 14],
[15, 16]])],
dtype=object)
没有它
clist
会产生一个 (3,2,2) 数字对象数组:
In [45]: np.array(clist, object)
Out[45]:
array([[[1, 2],
[7, 8]],
[[9, 10],
[11, 12]],
[[13, 14],
[15, 16]]], dtype=object)
一种思考方式,
np.array
并没有为您提供指定对象数组的“深度”或“形状”的方法。 它必须“猜测”,并且在某些情况下猜测是错误的。