正如您所发现的,np.array 在给出类似的东西时会尝试创建一个二维数组
A = np.array([[1,2],[3,4]],dtype=object)
你已经应用了一些技巧来绕过这个默认行为。
一种是使子列表的长度可变。它不能从这些组成一个二维数组,所以它求助于对象数组:
In [43]: A=np.array([[1,2],[],[1,2,3,4]])
In [44]: A
Out[44]: array([[1, 2], [], [1, 2, 3, 4]], dtype=object)
然后您可以将值附加到每个列表中:
In [45]: for i in A: i.append(34)
In [46]: A
Out[46]: array([[1, 2, 34], [34], [1, 2, 3, 4, 34]], dtype=object)
np.empty 也创建了一个对象数组:
In [47]: A=np.empty((3,),dtype=object)
In [48]: A
Out[48]: array([None, None, None], dtype=object)
但是您必须小心如何将元素更改为列表。 np.fill很诱人,但有问题:
In [49]: A.fill([])
In [50]: A
Out[50]: array([[], [], []], dtype=object)
In [51]: for i in A: i.append(34)
In [52]: A
Out[52]: array([[34, 34, 34], [34, 34, 34], [34, 34, 34]], dtype=object)
事实证明fill 在所有插槽中都放置了相同的列表,因此修改一个会修改所有其他的。使用列表列表也会遇到同样的问题:
In [53]: B=[[]]*3
In [54]: B
Out[54]: [[], [], []]
In [55]: for i in B: i.append(34)
In [56]: B
Out[56]: [[34, 34, 34], [34, 34, 34], [34, 34, 34]]
初始化empty A 的正确方法是迭代,例如
In [65]: A=np.empty((3,),dtype=object)
In [66]: for i,v in enumerate(A): A[i]=[v,i]
In [67]: A
Out[67]: array([[None, 0], [None, 1], [None, 2]], dtype=object)
In [68]: for v in A: v.append(34)
In [69]: A
Out[69]: array([[None, 0, 34], [None, 1, 34], [None, 2, 34]], dtype=object)
问题和 cmets 有点不清楚您是要追加到列表还是将列表追加到数组。我刚刚演示了附加到列表。
有一个np.append 功能,新用户经常误用它。它不能替代列表附加。它是np.concatenate 的前端。这不是就地操作;它返回一个新数组。
同时定义一个要添加的列表可能很棘手:
In [72]: np.append(A,[[1,23]])
Out[72]: array([[None, 0, 34], [None, 1, 34], [None, 2, 34], 1, 23], dtype=object)
您需要构造另一个对象数组以连接到原始数组,例如
In [76]: np.append(A,np.empty((1,),dtype=object))
Out[76]: array([[None, 0, 34], [None, 1, 34], [None, 2, 34], None], dtype=object)
在所有这一切中,列表数组比列表列表更难构建,并且操作起来并不容易或更快。您必须将其设为二维列表数组才能获得一些好处。
In [78]: A[:,None]
Out[78]:
array([[[None, 0, 34]],
[[None, 1, 34]],
[[None, 2, 34]]], dtype=object)
您可以对对象数组进行整形、转置等操作,而创建和操作列表列表变得更加复杂。
In [79]: A[:,None].tolist()
Out[79]: [[[None, 0, 34]], [[None, 1, 34]], [[None, 2, 34]]]
===
如https://stackoverflow.com/a/57364472/901925所示,np.frompyfunc是创建对象数组的好工具。
np.frompyfunc(list, 0, 1)(np.empty((3,2), dtype=object))