我在NumPy中有两个简单的一维数组。我应该能够使用numpy.concatenate连接它们。但我收到以下代码的此错误:
TypeError:只有长度为 1 的数组可以转换为 Python 标量
代码
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
为什么?
我在NumPy中有两个简单的一维数组。我应该能够使用numpy.concatenate连接它们。但我收到以下代码的此错误:
TypeError:只有长度为 1 的数组可以转换为 Python 标量
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
为什么?
该行应该是:
numpy.concatenate([a,b])
您要连接的数组需要作为序列传递,而不是作为单独的参数。
从NumPy 文档:
numpy.concatenate((a1, a2, ...), axis=0)
将一系列数组连接在一起。
它试图将您解释b
为轴参数,这就是它抱怨无法将其转换为标量的原因。
连接一维数组有多种可能性,例如,
import numpy as np
np.r_[a, a]
np.stack([a, a]).reshape(-1)
np.hstack([a, a])
np.concatenate([a, a])
对于大型阵列,所有这些选项都同样快;对于小的,concatenate
有一点优势:
该图是使用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)",
)
第一个参数concatenate
本身应该是要连接的数组序列:
numpy.concatenate((a,b)) # Note the extra parentheses.
另一种方法是使用“连接”的缩写形式,即“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.]]
这里有更多使用 , 的方法来做到这一点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])
来自 numpy文档的更多事实:
语法为numpy.concatenate((a1, a2, ...), axis=0, out=None)
axis = 0 表示按行连接 axis = 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])
我希望它有帮助!