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
为轴参数,这就是为什么它抱怨它无法将其转换为标量.
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)
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)