将一个NumPy数组连接到另一个NumPy数组

245

我有一个numpy_array。类似于[ a b c ]

然后我想将它与另一个NumPy数组连接起来(就像我们创建一个列表的列表一样)。我们如何创建一个包含NumPy数组的NumPy数组?

我尝试了以下操作,但没有成功。

>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])

3
你可以创建一个“数组的数组”(使用对象数组),但你几乎肯定不想这样做。你想做什么?你只是想要一个二维数组吗? - Joe Kington
一个数组的数组被称为嵌套数组。本主题中有三个回答涉及 np.append(),它不保留嵌套结构。这是由于问题缺乏清晰的示例所导致的。 - questionto42
12个回答

292
In [1]: import numpy as np

In [2]: a = np.array([[1, 2, 3], [4, 5, 6]])

In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])

In [4]: np.concatenate((a, b))
Out[4]: 
array([[1, 2, 3],
       [4, 5, 6],
       [9, 8, 7],
       [6, 5, 4]])

或者这个:

In [1]: a = np.array([1, 2, 3])

In [2]: b = np.array([4, 5, 6])

In [3]: np.vstack((a, b))
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]])

1
嗨,当我运行这个代码时,我得到了这个输出np.concatenate((a,b),axis=1) 输出:array([1, 2, 3, 2, 3, 4]) 但是我想要的是numpy的二维数组? - frazman
3
我加入了 Sven 的 vstack() 想法。你知道可以使用 array([[1,2,3],[2,3,4]]) 创建该数组,对吧? - endolith
1
numpy.vstack可以接受多于2个数组作为序列参数。因此,如果您需要合并多于2个数组,vstack更加方便。 - ruhong
1
@oneleggedmule concatenate 函数也可以接受多个数组。 - endolith
@user12067965 你确定你在使用双括号吗?例如 concatenate((concatenate( - Rhubarb
显示剩余2条评论

94

错误信息已经说明了一切:NumPy数组没有append()方法。但是有一个自由函数numpy.append()可以使用:

numpy.append(M, a)

这将创建一个新的数组,而不是直接在原有的M上进行更改。请注意,使用numpy.append()会涉及复制两个数组。如果使用固定大小的NumPy数组,您将获得更好的性能。


嗨,当我尝试这个时,我得到了这个结果:
np.append(M,a) array([ 1., 2., 3.]) np.append(M,b) array([ 2., 3., 4.]) M array([], dtype=float64) 我希望M是一个二维数组?
- frazman
9
请查看numpy.vstack()函数。 - Sven Marnach
我认为这应该成为被接受的答案,因为它精确地回答了要点。 - Prasad Raghavendra
2
这个答案与问题不符。它只是将输入的任何结构平铺成一个一维数组。例如对于np.append(arr1,arr2),其中arr1和arr2是3x3的数组,输出的结构是1x18:array([1, 2, 0, 0, 1, 1, 1, 1, 2, 0, 1, 0, 0, 0, 1, 1, 0, 1])。这不是问题所要求的,相反,问题要求一个嵌套数组。 - questionto42

39
您可以使用 numpy.append() 函数来在数组的末尾添加值。
import numpy

B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )

print B

> [3 1 2 2]

这不会创建两个单独的数组,而是将两个数组追加成一个一维数组。


4
要求的是一个嵌套数组,而不是一个扁平化的数组。 - questionto42

10

在寻找如何将数组对象附加到一个空的numpy数组时,我发现了这个链接,但尝试了该页面上的所有解决方案均无效。

然后我找到了这个问题和答案:如何向空的numpy数组添加新行

关键点:

想要“开始”你想要的数组的方法是:

arr = np.empty((0,3), int)

然后你可以使用concatenate来添加行,就像这样:

arr = np.concatenate( ( arr, [[x,y,z]] ), axis=0 )

也可以参见https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html


这就是我最终不得不使用的,但它似乎相当笨拙。 - user3673

9

Sven已经说得很清楚了,只是需要非常小心,在调用append时由于自动类型调整可能会出现问题。

In [2]: import numpy as np

In [3]: a = np.array([1,2,3])

In [4]: b = np.array([1.,2.,3.])

In [5]: c = np.array(['a','b','c'])

In [6]: np.append(a,b)
Out[6]: array([ 1.,  2.,  3.,  1.,  2.,  3.])

In [7]: a.dtype
Out[7]: dtype('int64')

In [8]: np.append(a,c)
Out[8]: 
array(['1', '2', '3', 'a', 'b', 'c'], 
      dtype='|S1')

从内容中可以看出,dtype 从 int64 变成了 float32,然后变成了 S1


1
要求一个嵌套数组。 - questionto42

8

实际上,可以始终创建一个普通的numpy数组列表,并稍后将其转换。

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

In [3]: b = np.array([[1,2],[3,4]])

In [4]: l = [a]

In [5]: l.append(b)

In [6]: l = np.array(l)

In [7]: l.shape
Out[7]: (2, 2, 2)

In [8]: l
Out[8]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])

3
尝试这段代码:

试试这个代码:

import numpy as np

a1 = np.array([])

n = int(input(""))

for i in range(0,n):
    a = int(input(""))
    a1 = np.append(a, a1)
    a = 0

print(a1)

您也可以使用数组代替 "a"。


2

我遇到了同样的问题,但是由于声望不够,我无法评论@Sven Marnach的回答(天啊,我还记得Stackoverflow刚开始时...)

将一组随机数字添加到一个10×10的矩阵中。

最初的回答:

myNpArray = np.zeros([1, 10])
for x in range(1,11,1):
    randomList = [list(np.random.randint(99, size=10))]
    myNpArray = np.vstack((myNpArray, randomList))
myNpArray = myNpArray[1:]

使用np.zeros()创建一个由1行10个零组成的数组。最初的回答中提到了这一点。
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

然后使用np.random创建一个包含10个随机数的列表,并将其分配给randomList。循环将其堆叠10次。我们只需要记得删除第一个空条目即可。

Original Answer翻译成"最初的回答"

myNpArray

array([[31., 10., 19., 78., 95., 58.,  3., 47., 30., 56.],
       [51., 97.,  5., 80., 28., 76., 92., 50., 22., 93.],
       [64., 79.,  7., 12., 68., 13., 59., 96., 32., 34.],
       [44., 22., 46., 56., 73., 42., 62.,  4., 62., 83.],
       [91., 28., 54., 69., 60., 95.,  5., 13., 60., 88.],
       [71., 90., 76., 53., 13., 53., 31.,  3., 96., 57.],
       [33., 87., 81.,  7., 53., 46.,  5.,  8., 20., 71.],
       [46., 71., 14., 66., 68., 65., 68., 32.,  9., 30.],
       [ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
       [13., 36., 43., 45., 90., 17., 38.,  1., 41., 33.]])

So in a function:

def array_matrix(random_range, array_size):
    myNpArray = np.zeros([1, array_size])
    for x in range(1, array_size + 1, 1):
        randomList = [list(np.random.randint(random_range, size=array_size))]
        myNpArray = np.vstack((myNpArray, randomList))
    return myNpArray[1:]

a 7 x 7 array using random numbers 0 - 1000

array_matrix(1000, 7)

array([[621., 377., 931., 180., 964., 885., 723.],
       [298., 382., 148., 952., 430., 333., 956.],
       [398., 596., 732., 422., 656., 348., 470.],
       [735., 251., 314., 182., 966., 261., 523.],
       [373., 616., 389.,  90., 884., 957., 826.],
       [587., 963.,  66., 154., 111., 529., 945.],
       [950., 413., 539., 860., 634., 195., 915.]])

1

这是给那些使用numpy的ndarrays的人准备的。函数numpy.concatenate()同样适用。

>>a = np.random.randint(0,9, size=(10,1,5,4))
>>a.shape
(10, 1, 5, 4)

>>b = np.random.randint(0,9, size=(15,1,5,4))
>>b.shape
(15, 1, 5, 4)

>>X = np.concatenate((a, b))
>>X.shape
(25, 1, 5, 4)

vstack() 函数类似的方式。
>>Y = np.vstack((a,b))
>>Y.shape
(25, 1, 5, 4)

1
如果我理解你的问题,这是一种方法。假设你有以下内容:
a = [4.1, 6.21, 1.0]

所以这是一些代码...
def array_in_array(scalarlist):
    return [(x,) for x in scalarlist]

这导致了:
In [72]: a = [4.1, 6.21, 1.0]

In [73]: a
Out[73]: [4.1, 6.21, 1.0]

In [74]: def array_in_array(scalarlist):
   ....:     return [(x,) for x in scalarlist]
   ....: 

In [75]: b = array_in_array(a)

In [76]: b
Out[76]: [(4.1,), (6.21,), (1.0,)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接