首页 > 解决方案 > 使用 Python 将整个数组作为一个元素附加到另一个数组中,该数组内部具有不同大小的数组

问题描述

假设我有这样的数组'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,)
>>> 

标签: pythonarraysnumpyappend

解决方案


定义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)

由于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 个元素的新数组,但我怀疑它是否会比这个列表附加更好。

当我们尝试 时concatenateb列表首先变成了一个数组:

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,可a根据需要与 (2,) 配对:

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 element Out[31]concatenate加入数组。


推荐阅读