Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建列表的numpy数组?_Python_Arrays_List_Numpy - Fatal编程技术网

Python 如何创建列表的numpy数组?

Python 如何创建列表的numpy数组?,python,arrays,list,numpy,Python,Arrays,List,Numpy,我想创建一个numpy数组,其中每个元素都必须是一个列表,这样以后我就可以向每个元素添加新元素 我已经看过谷歌和这里的stack overflow了,但似乎哪里也找不到 主要问题是,numpy假设列表必须成为数组,但这不是我想要的。如果您真的需要一个1-d列表数组,您必须在自己的类中包装列表,因为numpy总是试图将列表转换为数组中的数组(效率更高,但显然需要恒定大小的元素),例如 class mylist: def __init__(self, l): self.l=

我想创建一个numpy数组,其中每个元素都必须是一个列表,这样以后我就可以向每个元素添加新元素

我已经看过谷歌和这里的stack overflow了,但似乎哪里也找不到


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

如果您真的需要一个1-d列表数组,您必须在自己的类中包装列表,因为numpy总是试图将列表转换为数组中的数组(效率更高,但显然需要恒定大小的元素),例如

class mylist:

    def __init__(self, l):
        self.l=l

    def __repr__(self): 
        return repr(self.l)

    def append(self, x):
        self.l.append(x)
然后,您可以更改任何图元,而无需更改其他图元的尺寸

>>> x = mylist([1,2,3])
>>> y = mylist([1,2,3])
>>> import numpy as np
>>> data = np.array([x,y])
>>> data
array([[1,2,3], [1,2,3]], dtype=object)
>>> data[0].append(2)
>>> data
array([[1,2,3,2], [1,2,3]], dtype=object)
更新 正如
ali_m
所建议的那样,实际上有一种方法可以强制numpy简单地创建一个1-d数组作为引用,然后向它们提供实际列表

>>> data = np.empty(2, dtype=np.object)
>>> data[:] = [1, 2, 3], [1, 2, 3]
>>> data
array([[1, 2, 3], [1, 2, 3]], dtype=object)
>>> data[0].append(4)
>>> data
array([[1, 2, 3, 4], [1, 2, 3]], dtype=object)

正如您所发现的,
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 [47]: A=np.empty((3,),dtype=object)
In [48]: A
Out[48]: array([None, None, None], 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 [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 [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
函数,新用户经常滥用它。它不是列表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))  
结果将是:

[list([0]) list([1]) list([2]) list([3]) list([4]) list([5]) list([6]) list([7]) list([8]) list([9]) list([10]) list([11]) list([12]) list([13]) list([14]) list([15]) list([16]) list([17]) list([18]) list([19])]

一个简单的方法是:

A = [[1,2],[3,4]] 
B = np.array(A+[[]])[:-1]

列表并不是很简单,所以可能一个列表元组就足够了。使用迭代器表达式,您可以轻松而高效地获得它:

fiveLists=tuple([]表示范围(5)内的uu)
如果只需要一次(提供原始迭代器),可以省略
元组

如果您确实想:

arrayOfLists=np.fromiter(([]表示范围(5)内的uuu),对象)
编辑:从2020年7月起,您可以
“ValueError:无法从迭代器创建对象数组”

刚刚发现这个问题,我以前从未回答过任何问题,但这里有一个非常简单的解决方案:

如果需要长度为n的向量,请使用:

A = np.array([[]]*n + [[1]])[:-1]
这将返回:

array([list([]), list([]), ... , list([])], dtype=object)
如果需要n×m数组,请使用:

A = np.array([[]]*n*m + [[1]])[:-1]
B = A.reshape((n,m))

对于更高秩的数组,您可以使用类似的方法,创建一个长向量并对其进行重塑。这可能不是最有效的方法,但对我来说很有效。

如果需要从列表或元组序列创建数组数组,请

x=[[1,2],[3,4],[5,6]]
print(type(x))
print(type(x[0]))
#<class 'list'>
#<class 'list'>
import numpy as np
ar=np.array([np.array(i) for i in x],dtype=object)
print(type(ar))
print(type(ar[0]))
#<class 'numpy.ndarray'>
#<class 'numpy.ndarray'>
x=[[1,2],[3,4],[5,6]]
打印(类型(x))
打印(类型(x[0]))
#
#
将numpy作为np导入
ar=np.array([np.array(i)表示x中的i],dtype=object)
打印(ar型)
打印(类型(ar[0]))
#
#

我意识到,如果您不需要熊猫,但它实现了既定目标,那么这是一种变通方法:

import pandas as pd

A = pd.Series([[1, 2], [3, 4]]).to_numpy()
assert isinstance(A[0], list)

为什么不创建2D数组?为什么不创建列表数组?为什么不创建数组?或者列表列表?我有特殊要求。请解释您的“特殊要求”更详细地说。如果您主要关心的是追加操作的速度,那么您不可能比常规的Python列表做得更好,因为与数组串联相比,追加到列表是非常便宜的。但是,如果您想对列表-o执行数字操作,这将带来巨大的存储和性能成本f-列表。是每个子列表都有相同的长度,还是你试图用不同的行长度表示一个“不规则”数组?@ali_m,稀疏图的邻接列表。我需要操作为O(m+n)。列表会杀死它。而且每个列表可能有不同的大小。我需要第一个向量是O(1)的数组用于访问每个元素,然后为给定列表中的每个元素创建一个以O(d_max)访问它的列表。在我的情况下,我不知道我将拥有多少MyList,如何以通用的方式访问它?不使用
data=np.empty(2,dtype=np.object);data[:]=[1,2,3],[1,2,3]定义一个新类,就可以获得相同的结果
@Ricardo如果你不知道你有多少个列表,那么你为什么要首先使用数组?它们的大小是恒定的。如果你想在移动中添加列表,那么可能最好是列表列表。否则-你可以始终使用
np.concatenate
合并数组这是一个有趣的观察结果@lejlot和一个警告其他正在寻找快捷方式的人…不要忘记data=np.empty(2,dtype=np.object)创建行。如果您试图使用…data=np.array([[1,2,3],[4,5,6]],dtype=np.object])明显跳过一步,请尝试…data[0]。追加(4)它将返回…AttributeError:'numpy.ndarray'对象在Python3.4.x中没有属性'append'