连接两个一维 NumPy 数组

问题描述 投票:0回答:7

如何在 NumPy 中连接两个一维数组?我试过

numpy.concatenate
:

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

但是我收到错误:

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

python arrays numpy concatenation numpy-ndarray
7个回答
525
投票

用途:

np.concatenate([a, b])

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

来自 NumPy 文档

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

将数组序列连接在一起。

它试图将您的

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


81
投票

连接一维数组有多种可能性,例如,

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)",
)

39
投票

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

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

14
投票

另一种方法是使用“concatenate”的缩写形式,即“r_[...]”或“c_[...]”,如下面的示例代码所示(有关其他信息,请参阅Link):

%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
投票

来自 numpy docs 的更多事实:

语法为

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

希望对你有帮助!


2
投票

这里有更多方法可以使用

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

0
投票

稍微不同的问题,那就是如果你想要两个形状为

(n,)
的一维数组变成
(2,n)
,那么你有以下选择:

import numpy as np

np.r_[[a], [a]]
np.stack([a, a])
np.vstack([a, a])
np.concatenate([[a], [a]])
np.array([a, a])

最快的方法是使用普通的

numpy.array
:

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]),
        lambda a: numpy.vstack([a, a]),
        lambda a: numpy.concatenate([[a], [a]]),
        lambda a: numpy.array([a, a]),
    ],
    labels=["r_", "stack", "vstack", "concatenate", "array"],
    n_range=[2 ** k for k in range(19)],
    xlabel="len(a)",
)

© www.soinside.com 2019 - 2024. All rights reserved.