Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接两个一维NumPy数组_Python_Arrays_Numpy_Concatenation_Numpy Ndarray - Fatal编程技术网

Python 连接两个一维NumPy数组

Python 连接两个一维NumPy数组,python,arrays,numpy,concatenation,numpy-ndarray,Python,Arrays,Numpy,Concatenation,Numpy Ndarray,我有两个简单的一维数组。我应该能够使用。但我得到以下代码的错误: TypeError:只有长度为1的数组才能转换为Python标量 代码 为什么?连接的第一个参数本身应该是要连接的数组序列: numpy.concatenate((a,b)) # Note the extra parentheses. 线路应为: numpy.concatenate([a,b]) 要连接的数组需要作为序列传递,而不是作为单独的参数传递 从: numpy.连接((a1,a2,…),轴=0) 将一系列数组连接在一起

我有两个简单的一维数组。我应该能够使用。但我得到以下代码的错误:

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

代码
为什么?

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

numpy.concatenate((a,b)) # Note the extra parentheses.
线路应为:

numpy.concatenate([a,b])
要连接的数组需要作为序列传递,而不是作为单独的参数传递

从:

numpy.连接((a1,a2,…),轴=0)

将一系列数组连接在一起


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

另一种ist使用“concatenate”的缩写形式,即“r_[…]”或“c_[…]”,如下面的示例代码所示(有关更多信息,请参阅):

其结果是:

[ 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阵列有多种可能性,例如:

numpy.r\uA[a,a],
numpy.stack([a,a])。重塑(-1),
numpy.hstack([a,a]),
numpy.concatenate([a,a])
所有这些选项对于大型阵列都同样快速;对于小型的,
concatenate
有一点优势:

绘图是通过以下方式创建的:

导入numpy
导入性能图
perfplot.show(
设置=λn:numpy.random.rand(n),
果仁=[
lambda:numpy.r_a[a,a],
lambda:numpy.stack([a,a])。重塑(-1),
lambda:numpy.hstack([a,a]),
lambda:numpy.concatenate([a,a]),
],
标签=[“r_3;”、“堆叠+重塑”、“hstack”、“连接”],
n_范围=[2**k表示范围(19)中的k],
xlabel=“len(a)”,
)

利用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])

我希望有帮助

vector_b=[1,1,1,1]#“array”的缩写形式
,这根本不是真的。vector_b将是标准的Python列表类型。然而,Numpy非常擅长接受序列,而不是强制所有输入都是Numpy.array类型。你是对的,我错了。我更正了我的源代码和结果。谢谢!只是好奇-这背后的逻辑是什么?@user391339,如果你想连接三个数组呢?如果只使用两个数组,则该函数在获取序列时更有用。@WinstonEwert假设问题不是它硬编码为两个参数,您可以像
numpy.concatenate(a1,a2,a3)
numpy.concatenate(*[a1,a2,a3])
一样使用它。Python的流动性足以让人感觉到这种差异只是表面上的,而不是实质上的,但如果API是一致的(例如,如果所有采用可变长度参数列表的numpy函数都需要显式序列),这种差异就很好了。@JimK。axis参数会发生什么情况?假设要连接的都是位置参数,您可以将axis保留为关键字参数,例如
def concatx(*sequences,**kwargs)
)。这并不理想,因为您似乎无法以这种方式在签名中显式地命名关键字args,但有一些变通方法。这些替代方法都使用
np.concatenate
。他们只是在手之前以各种方式按摩输入列表<例如,code>np.stack为所有输入数组添加一个额外维度。看看他们的源代码。只编译了
concatenate
。只需添加到@hpaulj的注释中,时间都会随着数组大小的增加而收敛,因为
np.concatenate
会复制输入。然后,此内存和时间成本超过了“按摩”输入所花费的时间。如果要沿一个轴将它们连接(到单个数组中),请使用
np。concatenate(…,axis)
。如果要垂直堆叠,请使用
np.vstack
。如果要水平地将它们堆叠(成多个数组),请使用
np.hstack
。(如果要按深度堆叠,即第三维,请使用
np.dstack
)。请注意,后者类似于pandas
pd.concat
# 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])
>>> 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])