2014-11-08 3 views
1

stackoverflow를 검색했지만이 특정 질문에 대한 답을 찾을 수 없습니다. 미안합니다. 순진한 질문이라면, 저는 파이썬에 초보자입니다.2 차원 배열을 파이썬에서 3d 배열로 읽는 것

필자는 파이썬에서 3d 배열 (목록)으로 읽으려는 여러 개의 2 차원 배열 (또는 목록)을 가지고 있습니다. matlab에, 나는 단순히

for i=1:N 
    # read 2d array "a" 
    newarray(:,:,i)=a(:,:) 
end 

그렇게 newarray "는"이 2D 조각은 3 차원을 따라 배열되어있는 3 차원 배열 할 수 있습니다.

파이썬에서이 작업을 수행하는 간단한 방법이 있습니까?

편집 : 저는 현재 노력하고 다음

for file in files:  
    img=mpimg.imread(file) 
    newarray=np.array(0.289*cropimg[:,:,0]+0.5870*cropimg[:,:,1]+0.1140*cropimg[:,:,2]) 
    i=i+1 

나는 newarray[:,:,i]을 시도하고 내가 NumPy와 배열로 newarray 정의 할 필요가 같은

NameError: name 'newarray' is not defined 

이 보인다 내게 오류를 준다? 확실하지 않다.

감사합니다.

+0

이러한 배열은'numpy.ndarray' 또는'array.array'와 같은가, 아니면 그 목록입니까? – abarnert

+0

@abarnert 여러 이미지 파일을 3D 배열로 읽으려고합니다. '파일의 파일 : IMG = mpimg.imread (파일) cropimg IMG = [100 : 600,200 : 960] newarray = np.array (0.289 * cropimg의 [: : 0] + 0.5870 * cropimg의 [:, : newlray [:, :, i]'시도했지만 오류가 발생했습니다 – MPy

+0

@MPy : 조금 설명 해주세요. "오류가 발생했습니다"라고 말하면 누구나 코드를 디버깅 할 수 없습니다. 예외 추적 (traceback)을 포함하여 [최소한의 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 제공하십시오. – abarnert

답변

1

MATLAB에 익숙하다면 NumPy을 사용하여 변환하는 것은 매우 간단합니다.

:

은 단순히 다른 차원으로 넣어 반복 가능으로 배열 생성자 (예 : 목록) 둘 다 합격과 같이 할 경우 몇 배열

a = np.eye(3) 
b = np.arange(9).reshape((3, 3)) 

print(a) 
# [[ 1. 0. 0.] 
# [ 0. 1. 0.] 
# [ 0. 0. 1.]] 

print(b) 
# [[0 1 2] 
# [3 4 5] 
# [6 7 8]] 

가 있다고 가정하자

x = np.array([a, b]) 
print(x) 
# [[[ 1. 0. 0.] 
# [ 0. 1. 0.] 
# [ 0. 0. 1.]] 
# 
# [[ 0. 1. 2.] 
# [ 3. 4. 5.] 
# [ 6. 7. 8.]]] 

Numpy는 똑같은 크기의 배열을 인식 할만큼 똑똑하고 충분히 지탱할 새로운 차원을 만듭니다.

print(x.shape) 
# (2, 3, 3) 

당신은 그것을 통해 루프를 할 수 있지만, 당신은 몇 가지 차원 가로 질러에 동일한 작업을 적용 할 경우, 나는 강하게 NumPy와 조작를 벡터화 할 수 있도록 방송을 사용하고 훨씬을 실행 제안 빠릅니다.

예를 들어 한 차원에서 한 슬라이스에 2를 곱하고 다른 슬라이스에 3을 곱합니다. (순수 스칼라가 아닌 경우 브로드 캐스트 할 동일한 차원 수로 배열을 다시 형성 한 다음 각 배열과 일치해야하거나 1)이어야합니다. 제 0 축을 따라 작업 중이므로 이미지가 다를 수 있습니다. 당신이 NumPy 배열을 사용하는 경우 내가

y = x * np.array([2, 3]).reshape((2, 1, 1)) 
print(y) 
#[[[ 2. 0. 0.] 
# [ 0. 2. 0.] 
# [ 0. 0. 2.]] 
# 
# [[ 0. 3. 6.] 
# [ 9. 12. 15.] 
# [ 18. 21. 24.]]] 

와 장난감까지 넣을 수있는 편리한 이미지가없는 그런 다음 우리는 당신이 matlab에에서 거의 직접 번역 할 수 있습니다, 최대

z = np.sum(y, axis=0) 
print(z) 
#[[ 2. 3. 6.] 
# [ 9. 14. 15.] 
# [ 18. 21. 26.]] 
0

에 추가 할 수 있습니다 : 배열은 0 기반 인덱스를 사용하기 때문에 물론

for i in range(1, N+1): 
    # read 2d array "a" 
    newarray[:, :, i] = a[:, :] 

당신은 아마 range(N)을 사용할 것입니다. 그리고 분명히 Matlab에서와 마찬가지로 어떤 식 으로든 newarray을 사전 작성해야하지만, 직접 변환 할 수도 있습니다.(당신이 방법을 모르는 경우 zeros 기능을 검색합니다.)


당신이 목록을 사용하는 경우, 당신이 직접하지만 당신은 아마 어쨌든 싶지 않아 할 수 없습니다.

newarray = [] 
for i in range(N): 
    # read 2d list of lists "a" 
    newarray.append(a) 

또는, 더 간단하게 :

newarray = [read_next_2d_list_of_lists() for i in range(N)] 

또는 더 나은, 그 read 기능 발전기 할 바로 그때, 2D는 즉시 목록 더 나은 솔루션 목록을 구축하는 것입니다 : 당신이 축 순서를 바꾸어하려면

newarray = list(read_next_2d_list_of_lists()) 

, 당신이에 대한 zip 기능을 사용할 수 있습니다.

관련 문제