当前位置: 首页 > 面试题库 >

如何创建一个列表的numpy数组?

宦翔飞
2023-03-14
问题内容

我想创建一个numpy数组,其中每个元素必须是一个列表,因此以后我可以向每个元素追加新元素。

我已经看过谷歌,这里已经有堆栈溢出,但是似乎找不到地方。

主要问题是numpy假定您的列表必须成为数组,但这不是我要的。


问题答案:

如您所见,np.array在给出类似以下内容时,尝试创建2d数组

 A = np.array([[1,2],[3,4]],dtype=object)

您已应用了一些技巧来解决此默认行为。

一种是使子列表的长度可变。它不能从这些数组中生成2d数组,因此它求助于对象数组:

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)

从问题和注释中不清楚是要追加到列表还是追加列表到数组。我刚刚演示了追加到列表。

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

在所有这些方面,列表数组比列表列表更难构建,并且操作起来也不容易,也没有更快。您必须使其成为2D列表数组才能获得一些好处。

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]]]

===

如所示,它np.frompyfunc是创建对象数组的好工具。

np.frompyfunc(list, 0, 1)(np.empty((3,2), dtype=object))


 类似资料:
  • 问题内容: 我有以下代码片段,我不明白为什么它不起作用: 有人能指出我正确的方向吗? 我已经看到JonSkeet在另一个问题上的回答,但是那里的最后一个示例对我来说不起作用。即使我将强制类型转换添加到标记为的行或行中,也会出现编译错误。 问题答案: 您始终可以通过明确指定type参数来告诉Java您想要列表:

  • 我有一个Numpy数组,由一系列列表组成,表示一个二维数组,其中包含行标签和列名,如下所示: 但是,我不确定如何最好地分配列标题。

  • 问题内容: 我想要创建一个arraylist数组,如下所示: 但是它没有编译。我怎样才能做到这一点? 问题答案: 根据Oracle文档: “你不能创建参数化类型的数组” 相反,你可以执行以下操作: 正如汤姆·霍廷(Tom Hawting)的建议-定位线一样,最好这样做:

  • 灵感来源于如何在R?中创建数字序列的帖子 问题: 我想在NumPy中制作以下序列。 我尝试了以下方法: Non-generic and hard coding using 上面的解决方案是通用的,但我想知道是否有更有效的方法在NumPy中实现。

  • 问题内容: 假设我有; 我尝试转换; 我现在正在vstack上通过迭代来解决它,但是对于特别大的LIST来说确实很慢 您对最佳有效方法有何建议? 问题答案: 通常,您可以沿任意轴连接整个数组序列: 但你 也 必须对列表中的形状和每个阵列的维度担心(用于2维3x5的输出,你需要确保它们都是2维正由-5阵列的话)。如果要将一维数组连接为二维输出的行,则需要扩展其维数。 正如Jorge的答案所指出的那样

  • 问题内容: 我是Python的完整新手,但似乎给定的字符串可以(有效)为任意长度。也就是说,您可以加入并继续添加:。有没有办法制作这样的字符串数组? 当我尝试此操作时,每个元素仅存储一个字符 另一方面,我知道我可以初始化一定长度的字符串数组,即 最多可以存储10个字符串,最多256个字符。 问题答案: 您可以通过创建一个数组来实现。如果您尝试将长字符串分配给普通的numpy数组,则会截断该字符串: