python怎么新建一个列表_如何创建一个numpy列表列表?

这篇博客探讨了如何在Python中创建二维列表和Numpy对象数组,特别是处理可变长度子列表的情况。文章通过示例展示了使用np.array、np.empty以及np.frompyfunc等方法,并解释了在填充和修改这些结构时需要注意的陷阱。
摘要由CSDN通过智能技术生成

正如您所发现的那样,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]]

初始化空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)

从问题和评论中有点不清楚是否要附加到列表或将列表追加到数组中.我刚刚演示了附加到列表中.

有一个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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值