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

我有一个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])
853650 次浏览

嗯,错误消息说明了一切:NumPy数组没有append()方法。然而,有一个自由函数numpy.append():

numpy.append(M, a)

这将创建一个新数组,而不是原地改变M。注意,使用numpy.append()涉及复制两个数组。如果使用固定大小的NumPy数组,您将获得性能更好的代码。

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]])

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

如果我明白你的问题,我有一个办法。假设你有:

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,)]

你可以使用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]

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

实际上,我们总是可以创建一个普通的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]]])

我在寻找一些略有不同的东西时发现了这个链接,如何开始将数组对象追加到 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

我也遇到了同样的问题,我无法评论@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 x 10个零的数组。

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

然后使用np创建一个包含10个随机数的列表。random和赋值给randomList。 这个循环把它堆成10层高。我们只需要记住删除第一个空项

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.]])

在函数中:

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:]

一个7 × 7的数组,使用随机数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.]])

试试下面的代码:

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"

当你想要沿着一个现有的轴(按行)连接时,np.vstacknp.concatenate将为你工作。

有关连接操作的详细列表,请参见官方文档

这是为使用numpy's 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)
有一些方法可以将数组堆叠在一起,这取决于堆栈的方向。 例如,你可以考虑np.stack() (医生), np.vstack() (医生)和np.hstack() (医生)