连接两个一维NumPy数组

时间:2012-02-11 01:11:06

标签: python arrays numpy concatenation numpy-ndarray

我在NumPy中有两个简单的一维数组。我应该能够使用numpy.concatenate连接它们。但我得到以下代码的错误:

  

TypeError:只能将length-1数组转换为Python标量

代码

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

为什么?

6 个答案:

答案 0 :(得分:281)

该行应为:

numpy.concatenate([a,b])

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

来自NumPy documentation

  

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

     

加入一系列数组。

它试图将您的b解释为轴参数,这就是为什么它抱怨它无法将其转换为标量。

答案 1 :(得分:25)

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

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

答案 2 :(得分:17)

连接1D阵列有几种可能性,例如,

numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.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)',
    logx=True,
    logy=True,
    )

答案 3 :(得分:10)

另一种方法是使用“连接”的简短形式,即“r _ [...]”或“c _ [...]”,如下面的示例代码所示(参见http://wiki.scipy.org/NumPy_for_Matlab_Users for附加信息):

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

答案 4 :(得分:1)

更多来自numpy docs的事实:

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

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

希望对您有帮助!

答案 5 :(得分:0)

利用numpy.ravel()numpy.array(),还有更多的方法可以利用一维数组可以解包为普通元素的事实:

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