2017-12-30 21 views
0

2 차원 배열의 값을 매핑하려고합니다. 즉, 행을 (효율적으로) 반복하고 행 인덱스를 기반으로 값을 추가하려고합니다.numpy 맵 2D 배열 값

source = misc.imread(fname) # Load some image 
img = np.array(source, dtype=np.float64)/255 # Cast and normalize values 
w, h, d = tuple(img.shape) # Get dimensions 
img = np.reshape(img, (w * h, d)) # Flatten 3D to 2D 

# The actual problem: 
# Map (R, G, B) pixels to (R, G, B, X, Y) to preserve position 
img_data = ((px[0], px[1], px[2], idx % w, int(idx // w)) for idx, px in enumerate(img)) 
img_data = np.fromiter(img_data, dtype=tuple) # Get back to np.array 

하지만 해결책은 제기 : 나는 시도 접근 방법의

하나는 ValueError: cannot create object arrays from iterator

사람이 numpy 효율적이 터무니없이 간단한 작업을 수행하는 방법을 제안 할 수 있습니다? 이 라이브러리가 얼마나 복잡한 지 내 마음에 들지 않습니다. 왜이 코드는 7000x5000 픽셀의 메모리를 몇기만 소비합니까?

감사

+0

있다 np.array (img_data)'를 사용하여 모든 것을'np array '로 변환하면됩니까? – Adorn

답변

0

어쩌면 np.concatenatenp.indices 다음 [:,:,:-1]가 '추가'0 항목을 제거합니다

np.concatenate((np.arange(40).reshape((4,5,2)), *np.indices((4,5,1))), axis=-1)[:,:,:-1] 
Out[264]: 
array([[[ 0, 1, 0, 0], 
     [ 2, 3, 0, 1], 
     [ 4, 5, 0, 2], 
     [ 6, 7, 0, 3], 
     [ 8, 9, 0, 4]], 

     [[10, 11, 1, 0], 
     [12, 13, 1, 1], 
     [14, 15, 1, 2], 
     [16, 17, 1, 3], 
     [18, 19, 1, 4]], 

     [[20, 21, 2, 0], 
     [22, 23, 2, 1], 
     [24, 25, 2, 2], 
     [26, 27, 2, 3], 
     [28, 29, 2, 4]], 

     [[30, 31, 3, 0], 
     [32, 33, 3, 1], 
     [34, 35, 3, 2], 
     [36, 37, 3, 3], 
     [38, 39, 3, 4]]]) 

는, 어쩌면 당신은 왜 당신이 어떤 목록을 생성하지 않는 더 나은 방법