连接两个一维NumPy数组

hig*_*dth 225 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)
Run Code Online (Sandbox Code Playgroud)

为什么?

Win*_*ert 318

该行应该是:

numpy.concatenate([a,b])
Run Code Online (Sandbox Code Playgroud)

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

NumPy文档:

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

将一系列数组连接在一起.

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

  • @ user391339,如果你想连接三个数组怎么办?如果它只采用两个数组,那么该函数在获取序列时更有用. (8认同)
  • 谢谢!只是好奇 - 这背后的逻辑是什么? (2认同)

Gab*_*abe 31

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

numpy.concatenate((a,b)) # Note the extra parentheses.
Run Code Online (Sandbox Code Playgroud)


Nic*_*mer 23

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

numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.concatenate([a, a])
Run Code Online (Sandbox Code Playgroud)

对于大型阵列,所有这些选项同样快; 对于小的,concatenate有一点点边缘:

在此输入图像描述

该图是使用perfplot创建的:

import numpy
import perfplot

perfplot.save(
    "o.png",
    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,
    )
Run Code Online (Sandbox Code Playgroud)

  • 替代品都使用`np.concatenate`.他们只是手动按照各种方式按下输入列表.例如,`np.stack`为所有输入数组添加了一个额外的维度.看看他们的源代码.只编译`concatenate`. (6认同)
  • 只是添加到 @hpaulj 的评论 - 随着数组大小的增长,时间都会收敛,因为“np.concatenate”会复制输入。这种内存和时间成本超过了“按摩”输入所花费的时间。 (2认同)

Sem*_*ger 10

另一种方法是使用"连接"的简短形式,即"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)
Run Code Online (Sandbox Code Playgroud)

结果如下:

[ 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.]]
Run Code Online (Sandbox Code Playgroud)

  • `vector_b = [1,1,1,1] #short形式的"数组"`,这根本不是真的.vector_b将是标准的Python列表类型.然而,Numpy非常擅长接受序列而不是强制所有输入都是numpy.array类型. (2认同)
  • 你是对的 - 我错了.我更正了源代码以及结果. (2认同)