Python 我如何在numpy中创建一个空列表的网格,即';接受';追加?

Python 我如何在numpy中创建一个空列表的网格,即';接受';追加?,python,numpy,append,attributeerror,Python,Numpy,Append,Attributeerror,我正在尝试使用numpy.append,但有些地方出了问题,对我来说再也没有意义了。有人能解释我为什么会出错吗 >>> np.array([[], [], []]).shape (3, 0) >>> a=[[], [], []] >>> a[1].append(3) >>> a [[], [3], []] >>> b=np.array(a) >>> b[0].append(3) arr

我正在尝试使用numpy.append,但有些地方出了问题,对我来说再也没有意义了。有人能解释我为什么会出错吗

>>> np.array([[], [], []]).shape
(3, 0)

>>> a=[[], [], []]
>>> a[1].append(3)
>>> a
[[], [3], []]

>>> b=np.array(a)
>>> b[0].append(3)
array([[3], [3], []], dtype=object)
这对我来说是合乎逻辑的,但是当我尝试下面的方法时,它就停止工作了

>>> c=np.array((3,0),dtype=object)
>>> c[0].append(3)
AttributeError: 'int' object has no attribute 'append'

????
>>> np.empty((3,1))[0].append(3)
AttributeError: 'numpy.ndarray' object has no attribute 'append'

>>> np.empty((3,0))[1].append(3)
AttributeError: 'numpy.ndarray' object has no attribute 'append'

>>>np.empty((6,1),dtype=object)[0].append(3)
AttributeError: 'numpy.ndarray' object has no attribute 'append'

已解决:

不要只看形状;检查数据类型,如果是对象,则检查元素的性质

In [282]: np.array([[], [], []])
Out[282]: array([], shape=(3, 0), dtype=float64)
二维浮点数数组
np.array
尝试创建一个多维数字数组;只有当它做不到这一点时,它才会生成一个对象数组

In [283]: b=np.array([[],[3],[]])
In [284]: b
Out[284]: array([[], [3], []], dtype=object)
这里的3个子列表大小不同,因此无法生成2d数组;结果是一个对象数组,其中的对象是列表,并具有append方法

In [286]: c=np.array((3,0), object)
In [287]: c
Out[287]: array([3, 0], dtype=object)
In [288]: np.empty((3,1))
Out[288]: 
array([[ 0.],
       [ 0.],
       [ 0.]])
这是一个(2,)对象数组;这两个元素是数字。数字没有append方法

In [286]: c=np.array((3,0), object)
In [287]: c
Out[287]: array([3, 0], dtype=object)
In [288]: np.empty((3,1))
Out[288]: 
array([[ 0.],
       [ 0.],
       [ 0.]])
浮点数的(3,1)数组。数字或数组没有附加方法

In [289]: np.empty((3,0))
Out[289]: array([], shape=(3, 0), dtype=float64)
另一个二维浮点数数组

In [290]: np.empty((6,1),object)
Out[290]: 
array([[None],
       [None],
       [None],
       [None],
       [None],
       [None]], dtype=object)
数据类型对象的二维数组。在这种情况下,它们被初始化为
None
。同样没有附加方法

In [286]: c=np.array((3,0), object)
In [287]: c
Out[287]: array([3, 0], dtype=object)
In [288]: np.empty((3,1))
Out[288]: 
array([[ 0.],
       [ 0.],
       [ 0.]])
有关制作列表数组的详细信息


但是oops-这些列表都是相同的对象(指针):(我必须在每个元素中放置不同的列表。现在我可以分别附加到它们

In [311]: d[...]=[[],[1,2,3],[2]]
In [312]: d
Out[312]: array([[], [1, 2, 3], [2]], dtype=object)
In [313]: d[0].append([2,3])
In [314]: d
Out[314]: array([[[2, 3]], [1, 2, 3], [2]], dtype=object)
我认为您必须咬紧牙关,使用列表初始化列表的对象数组。没有捷径:

In [319]: d=np.empty((3,),object)
In [320]: d[...]=[[] for _ in range(3)]
In [321]: d
Out[321]: array([[], [], []], dtype=object)
In [323]: d
Out[323]: array([[], [3], []], dtype=object)

首先,当有人回答正确时,停止更新你的问题。接受/更新答案,并在你准备好后提出新问题。问答网站也是如此,它旨在帮助未来的访问者查看你的问题,而不仅仅是你。完全为了你自己的利益而改变上下文,从而使所有好的答案无效,这会破坏你的目的至少可以说,这是一个非常好的网站

其次,
np.array([[]、[3]、][]])
最后是
dtype=object
,因为它是一个参差不齐的数组。
[[]、[]、[]、[]
[[3]、[3]]
,在所有维度的所有元素中具有统一的长度,将生成数字数组


np.zeros((6,),dtype=object)
生成对象引用的空数组(包含null)。当您用
[]填充它时
,您在每个元素中填充了对同一python
列表的引用。
numpy
不知道您要传递给哪个对象
ndarray。fill
,因此它不会像您期望的那样为每个元素调用
列表
类型上的构造函数。它只是复制您指定的引用在这之后,应该很清楚为什么更改一个列表的内容会导致所有数组元素都发生了更改。

我知道这是一个非常不寻常的用例,但事实上,在每个单元格中都有一个保存列表的数组是非常方便的。Imho numpy应该允许将lambda函数传递给
fill
m=np.empty((12,12),dtype=object)
对于np.ndindex(m.shape)中的i:m[i]=[]

感谢您的回复。您知道我上次编辑的内容为什么会附加到所有列表中吗?原因与
alist=[[]]]*3;alist[0]。附加[1]相同
做同样的事情。元素都是相同的列表对象。对象数组像列表一样,包含指向内存中其他位置的对象的指针。停止从提供答案的人那里更改问题。如果你有新问题,请提出新问题,而不是编辑同一帖子。是
填写
should接受lamda函数,并最终接受要停止的参数bradcasting@KIC.如果传入一个函数(lambda只是一个简化的可调用函数),它将复制对函数的引用。您需要一个不同于
fill
entirelyyes的方法,我的意思是不应该。但它应该是一个新功能的意思。@KIC。我不确定我是否同意。如果您想这样做,可以使用
np.empty
并应用。