比如说我有一个数组'a',是这样的
>>> a = np.array([[1,2], [3,4,5]])
>>> a.shape
(2,)
>>>
现在我想把一个数组的全部内容,比如[6,7,8,9],作为一个元素而不是四个元素附加到它上面。
>>> b = np.append(a,[6,7,8,9])
>>> b.shape
(6,)
>>>
但这不是我想要的. 我想要的是通过将新数组中的每个元素堆叠到a中,让b有3个元素,而不是6个。我找到了一个如下的变通方法,但是正确的方法是什么?
>>> b = np.append(a,[0])
>>> b[2] = [6,7,8,9]
>>> b.shape
(3,)
>>>
你不应该用不同大小的数组创建numpy数组,因为这不是它的工作方式。
第一行的结果,将是由2个python列表组成的numpy数组。如果你想拥有不同大小的数组,那么你应该使用python list()
,不 ndarray
.
然后你就可以使用 append
方法。
a = [[1, 2], [3, 4, 5]]
a.append([6, 7, 8, 9])
定义2个数组。
In [19]: a = np.array([[1,2], [3,4,5]])
In [20]: b = np.array([6,7,8,9])
In [21]: a
Out[21]: array([list([1, 2]), list([3, 4, 5])], dtype=object)
Since a
是一个列表数组,让我们回溯一下,定义一下 b
作为一个列表。
In [22]: b = [6,7,8,9]
对象数组与列表相比,几乎没有任何优势。 最大的缺点是它没有一个 append
方法。
In [23]: a.tolist()
Out[23]: [[1, 2], [3, 4, 5]]
In [24]: alist = a.tolist()
In [25]: alist.append(b)
In [26]: np.array(alist)
Out[26]: array([list([1, 2]), list([3, 4, 5]), list([6, 7, 8, 9])], dtype=object)
虽然我们可以想出一个有3个元素的新数组的方法 但我怀疑它是否会比这个list append更好。
当我们尝试 concatenate
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ b
列表首先被变成一个数组。
In [30]: np.concatenate([a,b])
Out[30]: array([list([1, 2]), list([3, 4, 5]), 6, 7, 8, 9], dtype=object)
In [31]: np.array(b)
Out[31]: array([6, 7, 8, 9])
所以这个数组把(2,) a
与(4,) b
产生一个(6,)。
为了实现你想要的连词,我们必须首先将 b
在一个类似的对象dtype数组中。
In [32]: c = np.array([None])
In [33]: c
Out[33]: array([None], dtype=object)
In [34]: c[0]=b
In [35]: c
Out[35]: array([list([6, 7, 8, 9])], dtype=object)
c
是一个(1,)对象dtype,它与(2,) a
根据需要。
In [36]: np.concatenate((a,c))
Out[36]: array([list([1, 2]), list([3, 4, 5]), list([6, 7, 8, 9])], dtype=object)
这实际上和你的追加[0]是一样的。
In [40]: d = np.concatenate([a, [None]])
In [41]: d
Out[41]: array([list([1, 2]), list([3, 4, 5]), None], dtype=object)
In [42]: d[-1] = b
In [43]: d
Out[43]: array([list([1, 2]), list([3, 4, 5]), list([6, 7, 8, 9])], dtype=object)
你必须以某种方式或其他方式转换 b
变成一个单元素数组,而不是4个元素的 Out[31]
. concatenate
加入数组。