2017-12-30 80 views
0

私は2D numpy配列の値をマップしようとしています。つまり、行を(効率的に)反復処理し、行インデックスに基づいて値を追加しようとしています。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で効率的にこのばかばかしいほど簡単な操作を実行する方法を提案することができますか?このライブラリがどれほど複雑であるかは、私の心の外です。なぜ、そのコードが7000x5000pxのメモリをいくつか消費しているのですか?

おかげ

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

は、多分、なぜあなたは何のリストを生成していない良い方法

関連する問題