두 개의 1 차원 NumPy 배열 연결


266

NumPy에 2 개의 간단한 1 차원 배열이 있습니다. numpy.concatenate 사용하여 연결할 수 있어야합니다 . 그러나 아래 코드 에서이 오류가 발생합니다.

TypeError : 길이 1 배열 만 파이썬 스칼라로 변환 할 수 있습니다

암호

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

왜?


축을 따라 ( 단일 배열로) 연결 하려면을 사용하십시오 np.concatenat(..., axis). 세로로 쌓으려면을 사용하십시오 np.vstack. 여러 배열로 수평으로 쌓으려면을 사용하십시오 np.hstack. (깊이 방향으로 쌓으려면 (예 : 3 차원)을 사용하십시오 np.dstack). 후자는 판다pd.concat
smci

답변:


372

줄은 다음과 같아야합니다.

numpy.concatenate([a,b])

연결하려는 배열은 별도의 인수가 아닌 시퀀스로 전달해야합니다.

로부터 NumPy와 문서 :

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

일련의 배열을 함께 결합하십시오.

b축 매개 변수로 해석하려고 했기 때문에 스칼라로 변환 할 수 없다고 불평했습니다.


1
감사! 그냥 궁금해서-이것의 논리는 무엇입니까?
user391339

8
@ user391339, 세 개의 배열을 연결하려면 어떻게해야합니까? 이 함수는 배열을 두 개만 가져간 경우 시퀀스를 가져 오는 데 더 유용합니다.
Winston Ewert

문제를 가정하면이 두 개의 인수에 하드 코딩 있다는 아니다 @WinstonEwert, 당신은 그것을 좋아 사용할 수 있습니다 numpy.concatenate(a1, a2, a3)또는 numpy.concatenate(*[a1, a2, a3])당신이 선호하는 경우. 차이가 실질적인 것보다 차이를 느낄 정도로 파이썬의 유동성은 충분하지만 API가 일관된 경우에 좋습니다 (예 : 가변 길이 인수 목록을 취하는 모든 numpy 함수에 명시적인 시퀀스가 ​​필요한 경우).
Jim K.

@JimK. 축 파라미터는 어떻게 되나요?
윈스턴 에워 트

1
연결하는 것이 모두 위치 매개 변수라고 가정하면 축을 키워드 인수로 유지할 수 있습니다 (예 :) def concatx(*sequences, **kwargs). 이런 식으로 서명에서 키워드 args의 이름을 명시 적으로 지정할 수 없으므로 이상적이지 않지만 해결 방법이 있습니다.
Jim K.

37

1D 어레이를 연결하는 데는 몇 가지 가능성이 있습니다.

numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.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)",
)

9
대안은 모두 사용 np.concatenate합니다. 그들은 손으로 입력 목록을 다양한 방법으로 마사지합니다. np.stack예를 들어 모든 입력 배열에 추가 차원을 추가합니다. 그들의 소스 코드를보십시오. 만 concatenate컴파일됩니다.
hpaulj

1
@hpaulj의 의견에 추가하기 만하면 np.concatenate입력의 사본을 만들기 때문에 배열의 크기가 커짐에 따라 모든 시간이 수렴 합니다. 이 메모리 및 시간 비용은 입력을 '마사지'하는 데 소요 된 시간보다 큽니다.
n1k31t4

31

첫 번째 매개 변수 concatenate는 연결 하는 일련의 배열 이어야합니다 .

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

10

대안은 아래 예제 코드에서 볼 있듯이 "r _ [...]"또는 "c _ [...]"인 "concatenate"의 짧은 형식을 사용하지 않는 것입니다 ( 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.]]

2
vector_b = [1,1,1,1] #short form of "array"이것은 사실이 아닙니다. vector_b는 표준 Python 목록 유형입니다. 그러나 Numpy는 모든 입력을 numpy.array 유형으로 강제하는 대신 시퀀스를 받아들이는 데 상당히 능숙합니다.
Hannes Ovrén

2
네 말이 맞아-내가 틀렸어 소스 코드와 결과를 수정했습니다.
Semjon Mössinger

0

다음은 1D 배열을 일반 요소로 압축 해제 할 수 있다는 사실을 활용 하여 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

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

나는 그것이 도움이되기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.