Объединение двух одномерных массивов NumPy - PullRequest
211 голосов
/ 11 февраля 2012

У меня есть два простых одномерных массива в NumPy .Я должен быть в состоянии объединить их, используя numpy.concatenate .Но я получаю эту ошибку для кода ниже:

TypeError: только массивы длины 1 могут быть преобразованы в скаляры Python

Код

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

Почему?

Ответы [ 5 ]

292 голосов
/ 11 февраля 2012

Строка должна быть:

numpy.concatenate([a,b])

Массивы, которые вы хотите объединить, должны передаваться как последовательность, а не как отдельные аргументы.

Из документации NumPy :

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

Соедините последовательность массивов вместе.

Он пытался интерпретировать ваш b как параметр оси, поэтому он жаловался, что не может преобразовать его в скаляр.

29 голосов
/ 11 февраля 2012

Первый параметр concatenate сам должен быть последовательностью массивов для объединения:

numpy.concatenate((a,b)) # Note the extra parentheses.
18 голосов
/ 22 февраля 2017

Существует несколько возможностей объединения 1D-массивов, например,

numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.concatenate([a, a])

Все эти параметры одинаково быстры для больших массивов;для маленьких concatenate имеет небольшое преимущество:

enter image description here

Сюжет был создан с помощью 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)',
    logx=True,
    logy=True,
    )
10 голосов
/ 23 декабря 2013

Альтернативой является использование краткой формы "concatenate", которая имеет вид "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.]]
0 голосов
/ 28 апреля 2019

Вот еще несколько подходов для этого, используя 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])
...