2015-01-13 3 views
4

2 차원 np.arrays() 이상의 루프가 있고이 배열을 하나의 배열에 추가해야합니다.2 차원 배열을 하나의 단일 배열에 추가합니다.

일반 파이썬에서 내가 할 것이라고이 내가 L1에 대한 NumPy와 가진 동일한 결과를 얻을 어떻게

In [37]: a1 = [[1,2],[3,4]] 

In [38]: b1 = [[5,6],[7,8]] 

In [39]: l1 = [] 

In [40]: l1.append(a1) 

In [41]: l1.append(b1) 

In [42]: l1 
Out[42]: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 

?

답변

3

여기 어레이로부터 그 출력을 생성하는 한 방법이다 :

>>> np.dstack((a1,b1)).transpose(2,0,1) 

array([[[ 1, 2], 
     [ 3, 4]], 

     [[ 5, 6], 
     [ 7, 8]], 

np.dstack는 3 차원 배열을 생성하지만 축이 다른 순서로 판독 할 필요가있다. (0, 1, 2) 축의 순서가 (2, 0, 1)으로 변경되었으므로 축을 전 환하고 교환해야합니다.


다음은 잠재적으로 유용 할 수 있지만 관련성이없는 배열을 연결하는 데 대한 정보입니다. (질문의 나의 오해가 지적되기 전에 입력했습니다.) 배열에 가입

한 가지 방법은 np.concatenate을 사용하는 것입니다

>>> np.concatenate((a1, b1)) 
array([[1, 2], 
     [3, 4], 
     [5, 6], 
     [7, 8]]) 

이 다른 아래 하나의 스택. 배열을 나란히 배열하여 np.concatenate((a1, b1), axis=1)과 연결할 수도 있습니다. (두 개 이상의 배열을 함수로 전달할 수 있습니다.)

다른 기능이 있습니다. 위의 두 작업은 각각 np.vstack((a1,b1))np.hstack((a1,b1))을 사용하여 수행 할 수 있습니다.

당신이 3D 배열의 배열에 참여하려면

, 당신은 np.dstack((a1,b1))를 사용할 수 있습니다

array([[[1, 5], 
     [2, 6]], 

     [[3, 7], 
     [4, 8]]]) 

이 NumPy와 배열이, 파이썬 목록과 달리 동적으로 메모리에 성장할 수 없습니다 유의하십시오. 이러한 작업으로 인해 배열이 복사되고 새로운 메모리 블록이 더 큰 배열로 채워집니다. 배열이 큰 경우 비효율적 일 수 있습니다.

+0

이것은 'numpy'에 새로 온 사람들에게 정말 좋은 정보입니다. 그러나이 솔루션들 중 어느 것도 필요한 출력을 제공하지 못한다는 사실을 알아 두십시오. – gg349

+1

@ gg349 당신은 옳습니다. 나는 그 질문을 잘못 읽었습니다. 이 답변을 삭제하고 기회가있을 때 수정 해 보겠습니다. 감사! –

+1

나는 대답이 머물러 있어야한다고 생각하며 OP에 대한 귀중한 정보이다 – gg349

4

그냥 사용

l1 = np.array([a1,b1]) 

공지 사항 또한이 numpy 당신이 배열에 추가하지 않습니다. 먼저이를 할당 한 다음 그들을 채우기 :

import numpy as np 
a1 = np.array([[1,2],[3,4]]) 
b1 = np.array([[5,6],[7,8]]) 
#allocate exact size of the final array 
l1 = empty(((2,)+a1.shape),dtype=a1.dtype) 
l1[0]=a1 
l1[1]=b1 

하거나 (다른 사람에 의해 설명 dstack, hstack, concatenate) 많은 헬퍼 기능 중 하나

편집을 사용 : 나는 매우 위의 두 솔루션을 찾을 수 읽기 쉽고 파이썬에 가깝게 구문을 나열하지만, ​​이것은 다소 주관적이다. 이것이 얼마나 빨라지는지를 보자면 두 가지 솔루션 모두 연결을 기반으로 한 @unutbu가 제안한 가장 빠른 솔루션보다 빠릅니다. 또한보기를 만들지 않음을 주목하십시오.

+1

사실입니다 * 많은 * (큰 배열에 대한) 내 제안보다 더 빨리. – unutbu

3
a1 = np.array([[1,2],[3,4]]) 
b1 = np.array([[5,6],[7,8]]) 
l1 = np.r_['0,3', a1, b1] 

array([[[1, 2], 
     [3, 4]], 

     [[5, 6], 
     [7, 8]]]) 

'0,3'axis=0는 함께 연결하여, 적어도 3 개 차원으로 결과를 생성하도록 지시 np.r_ 특별 지시를 산출한다.


는 또는 대안 concatenatereshape를 사용하여보다 빠르고 읽을 수 및 :

l1 = np.concatenate([a1, b1]).reshape((2,)+a1.shape)) 

In [111]: a2 = np.tile(a1, (10000,1)) 

In [112]: b2 = np.tile(b1, (10000,1)) 

In [113]: %timeit np.r_['0,3', a2, b2].shape 
10000 loops, best of 3: 62.4 µs per loop 

In [114]: %timeit np.concatenate([a2, b2]).reshape((2,)+a2.shape) 
10000 loops, best of 3: 39.8 µs per loop 
+0

일반적인 경우'a1, b1'로 재구성하면'np.concatenate ([a1, b1]). reshape ((2, a1.shape [0], - 1))'이라고 써야합니다. 나는 그것을 더 많이 읽을 수 없다. – gg349

+1

@ gg349 : 실제로 가독성은 주관적입니다. 'concatenate/reshape'는'0,3 '과 같은 특수 지시어로'r_'보다 자주 사용하기 때문에 더 읽기 쉽습니다 * (사용법을 기억하기 위해 찾아야 만합니다.) – unutbu

관련 문제