2017-11-25 5 views
1

これは私のnumpyの初めての重要な使用であり、私は1つのスポットでいくつかの問題を抱えています。2D ndarrayで表される位置で3D ndarrayを変更する

だから、私は、(xsize + 2, ysize + 2, 3) ndarray、およびnewlife、ブール値の(xsize + 2, ysize + 2) ndarrayをcolorsを持っています。 newlifeが真であるすべての位置で、色の3つの値すべてに-5と5の間のランダムな値を追加したいとします。言い換えれば、newlifeは、2Dベクトルを、その位置のcolorsの色にランダム値を追加するかどうかにマップします。

私はこの上の百万のバリエーション試してみた:

colors[np.nonzero(newlife)] += (np.random.random_sample((xsize + 2,ysize + 2, 3)) * 10 - 5) 

を私は、私はこれを行うにはどうすればよい

ValueError: operands could not be broadcast together with shapes (589,3) (130,42,3) (589,3)

のようなものを得続けますか?

+0

変更する色は、3つのコンポーネントすべてに同じランダム値を追加するか、各コンポーネントに異なるランダム値を追加しますか?私はコードサンプルのために後者を推測していますが、確かに確認するだけです。 –

+0

後者、はい。さもなければ、私はちょうどそれを視覚的に異なる色にするのではなく、ランダムな量で色の明るさを変えています。 – Schilcote

答えて

1

私はこれが何をしたいんだと思う:

# example data 
colors = np.random.randint(0, 100, (5,4,3)) 
newlife = np.random.randint(0, 2, (5,4), bool) 

# create values to add, then mask with newlife 
to_add = np.random.randint(-5,6, (5,4,3)) 
to_add[~newlife] = 0 

# modify in place 
colors += to_add 
0

これはuint8 DTYPEを想定してその場で色を変更します。どちらの仮定は必須ではない。

import numpy as np 

n_x, n_y = 2, 2 
colors = np.random.randint(5, 251, (n_x+2, n_y+2, 3), dtype=np.uint8) 
mask = np.random.randint(0, 2, (n_x+2, n_y+2), dtype=bool) 

n_change = np.count_nonzero(mask) 
print(colors) 
print(mask) 
colors[mask] += np.random.randint(-5, 6, (n_change, 3), dtype=np.int8).view(np.uint8) 
print(colors) 

これを理解する最も簡単な方法はcolors[mask]の形状を見ることです。

関連する問題