如何在numpy中添加“接受”附加的空列表网格? [英] How do I make a grid of empty lists in numpy that 'accepts' appending?
问题描述
我正在尝试使用numpy.append,但是出了点问题,对我来说不再有意义。有人可以解释为什么我出错了吗?
I am trying to use numpy.append but something goes wrong and it just doesn't make sence to me anymore. Can someone explain why I am getting an error?
>>> 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)
这对我来说是合乎逻辑的,但是当我尝试以下操作时,它就停止工作。
This is all logical to me, yet when I try the following it stops working.
>>> 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'
已解决:如何创建列表的numpy数组?
推荐答案
不只是看一下形状;检查dtype,如果是对象,则检查元素的性质
Don't just look at the shape; check the dtype, and if object, the nature of the elements
In [282]: np.array([[], [], []])
Out[282]: array([], shape=(3, 0), dtype=float64)
2d浮点数组。 np.array
试图制作一个多维数字数组;
A 2d array of floats. np.array
tries to make a multidimensional array of numbers; it's only when it can't do that it makes an object array.
In [283]: b=np.array([[],[3],[]])
In [284]: b
Out[284]: array([[], [3], []], dtype=object)
这3个子列表的大小不同,因此无法创建2d数组;结果是一个对象数组,其中的对象是列表,并具有append方法。
Here the 3 sublists have different size, so it can't make a 2d array; the result is an object array, where the objects are lists, and have the append method.
In [286]: c=np.array((3,0), object)
In [287]: c
Out[287]: array([3, 0], dtype=object)
这是一个(2,)对象数组; 2个元素是数字。数字没有附加方法。
This is a (2,) object array; the 2 elements are numbers. Numbers don't have an append method.
In [288]: np.empty((3,1))
Out[288]:
array([[ 0.],
[ 0.],
[ 0.]])
(3,1)浮点数数组。没有对数字或数组的追加方法。
A (3,1) array of floats. No append method for numbers or arrays.
In [289]: np.empty((3,0))
Out[289]: array([], shape=(3, 0), dtype=float64)
另一个2d浮点数
In [290]: np.empty((6,1),object)
Out[290]:
array([[None],
[None],
[None],
[None],
[None],
[None]], dtype=object)
dtype对象的2d数组。在这种情况下,它们被初始化为 None
。再次没有添加方法。
2d array of dtype object. In this case they are initialized to None
. Again no append method.
创建列表数组的更多信息
More on making an array of lists
和
In [305]: d=np.empty((3,),object)
In [306]: d
Out[306]: array([None, None, None], dtype=object)
In [307]: d.fill([])
In [308]: d
Out[308]: array([[], [], []], dtype=object) # array of lists
In [309]: d[0].append([1,2,3])
In [310]: d
Out[310]: array([[[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]]], dtype=object)
但是,糟糕-这些列表都是相同的对象(指针):(到在每个元素中都有一个不同的列表。现在,我可以逐个追加它们。
But oops - those lists are all the same object (pointer) :( I have to put a different list in each element. Now I can append to them individually.
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)
我认为您必须咬紧牙关,并使用列表来初始化列表的对象数组。没有捷径:
I think you have to bite the bullet and use a list to initialize an object array of lists. There isn't a short cut:
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)
这篇关于如何在numpy中添加“接受”附加的空列表网格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!