连接两个一维NumPy数组

如何在NumPy中连接两个一维数组?我尝试了numpy.concatenate:

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5])
np.concatenate(a, b)

但是我得到一个错误:

TypeError:只有长度为1的数组可以转换为Python标量

489903 次浏览

concatenate的第一个参数本身应该是一个要连接的阵列序列:

numpy.concatenate((a,b)) # Note the extra parentheses.

使用:

np.concatenate([a, b])

要连接的数组需要作为序列传递,而不是作为单独的参数。

NumPy文档:

numpy.concatenate((a1, a2, ...), axis=0)

将数组序列连接在一起。

它试图将你的b解释为轴参数,这就是为什么它抱怨不能将它转换为标量的原因。

“concatenate”的一种替代形式是“r_[…]或“c_[…],如下面的示例代码所示(更多信息请参阅http://wiki.scipy.org/NumPy_for_Matlab_Users):

%pylab
vector_a = r_[0.:10.] #short form of "arange"
vector_b = array([1,1,1,1])
vector_c = r_[vector_a,vector_b]
print vector_a
print vector_b
print vector_c, '\n\n'


a = ones((3,4))*4
print a, '\n'
c = array([1,1,1])
b = c_[a,c]
print b, '\n\n'


a = ones((4,3))*4
print a, '\n'
c = array([[1,1,1]])
b = r_[a,c]
print b


print type(vector_b)

结果是:

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
[1 1 1 1]
[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.  1.  1.  1.  1.]




[[ 4.  4.  4.  4.]
[ 4.  4.  4.  4.]
[ 4.  4.  4.  4.]]


[[ 4.  4.  4.  4.  1.]
[ 4.  4.  4.  4.  1.]
[ 4.  4.  4.  4.  1.]]




[[ 4.  4.  4.]
[ 4.  4.  4.]
[ 4.  4.  4.]
[ 4.  4.  4.]]


[[ 4.  4.  4.]
[ 4.  4.  4.]
[ 4.  4.  4.]
[ 4.  4.  4.]
[ 1.  1.  1.]]

有几种连接1D数组的可能性,例如,

import numpy as np


np.r_[a, a]
np.stack([a, a]).reshape(-1)
np.hstack([a, a])
np.concatenate([a, a])

所有这些选项对于大型数组都同样快;对于小的,concatenate有一点优势:

enter image description here

该图形是用perfplot创建的:

import numpy
import perfplot


perfplot.show(
setup=lambda n: numpy.random.rand(n),
kernels=[
lambda a: numpy.r_[a, a],
lambda a: numpy.stack([a, a]).reshape(-1),
lambda a: numpy.hstack([a, a]),
lambda a: numpy.concatenate([a, a]),
],
labels=["r_", "stack+reshape", "hstack", "concatenate"],
n_range=[2 ** k for k in range(19)],
xlabel="len(a)",
)

以下是通过使用< >强numpy.ravel() < / >强< >强numpy.array() < / >强来实现这一点的更多方法,利用1D数组可以解压缩为普通元素的事实:

# we'll utilize the concept of unpacking
In [15]: (*a, *b)
Out[15]: (1, 2, 3, 5, 6)


# using `numpy.ravel()`
In [14]: np.ravel((*a, *b))
Out[14]: array([1, 2, 3, 5, 6])


# wrap the unpacked elements in `numpy.array()`
In [16]: np.array((*a, *b))
Out[16]: array([1, 2, 3, 5, 6])

来自numpy 文档的更多事实:

语法为numpy.concatenate((a1, a2, ...), axis=0, out=None)

轴= 0用于按行连接 轴= 1表示列级连接

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


# Appending below last row
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])


# Appending after last column
>>> np.concatenate((a, b.T), axis=1)    # Notice the transpose
array([[1, 2, 5],
[3, 4, 6]])


# Flattening the final array
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

我希望这能有所帮助!