2016-06-30 6 views
0

Iは2D numpyのアレイを有し、私はすべての要素を抽出する必要がarray[i][j]条件numpyはどのようにインデックスに基づいた条件で値は書かないのですか?

x1range < i < x2rangey1range < j < y2rangeが満たされた場合。

どのようにこのような条件を記述しますか? mgrid/ogridを使用する必要がありますか?

編集:私の追加要件を書いているはずです。私は上記の条件を満たす(0,0,0)にすべての要素の値を変更したいので、どこの条件とスプライシングを探していた。私はどこの条件があれば、私はそれを行うことができたと思った。

Edit2:また、上記の条件の 'not'を得ることは可能ですか?

として

if i > x1range and i < x2range and j > y1range and j < y2range: # the above condition 
    do nothing # keep original value 
else: 
    val = (0,0,0) 

答えて

0

問題#1:取得範囲内のインデックス

あなたはそれらのインデックスを取得するためにnp.meshgridを使用することができます -

In [145]: x1range,x2range = 2,5 
    ...: y1range,y2range = 1,4 
    ...: 

In [146]: np.meshgrid(np.arange(x1range,x2range),np.arange(y1range,y2range)) 
Out[146]: 
[array([[2, 3, 4], 
     [2, 3, 4], 
     [2, 3, 4]]), array([[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]])] 

問題# 2:oを抽出するRこれらの範囲

内の入力配列要素を設定するあなたが入力配列arrnp.ix_に直接インデックスを使用することができます - このインデックス付き

In [148]: arr 
Out[148]: 
array([[97, 69, 0, 60, 28, 97], 
     [98, 85, 24, 75, 97, 23], 
     [70, 25, 77, 86, 93, 66], 
     [ 0, 85, 51, 17, 40, 92], 
     [66, 28, 28, 22, 79, 52]]) 

In [149]: arr[np.ix_(np.arange(x1range,x2range),np.arange(y1range,y2range))] 
Out[149]: 
array([[25, 77, 86], 
     [85, 51, 17], 
     [28, 28, 22]]) 

、一つは直接これらすべての要素を設定することができます。

問題#3:あなたがそうのようboolean-indexingを伴って含むNumPy broadcastingを使用することができ、抽出またはNOTこれらの範囲

/設定0snot満足の要素を抽出するために、内の入力配列の要素を設定し、同じよう残りの部分を維持します -

In [150]: Imask = np.in1d(np.arange(arr.shape[0]),np.arange(x1range,x2range)) 
    ...: Jmask = np.in1d(np.arange(arr.shape[1]),np.arange(y1range,y2range)) 
    ...: arr[~(Imask[:,None] & Jmask)] = 0 
    ...: 

In [151]: arr 
Out[151]: 
array([[ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 25, 77, 86, 0, 0], 
     [ 0, 85, 51, 17, 0, 0], 
     [ 0, 28, 28, 22, 0, 0]]) 
+0

こんにちは、私はこれを試してみます。もう1つの質問ですが、このクエリを逆にしたいのですが?それは可能ですか?のように、この条件の 'ない'? – n00b

+0

@ n00bこの条件の「否」とは何を意味するのかというサンプルを使って質問を編集できますか? – Divakar

+0

こんにちは、私は編集し、not条件で展開しました。 – n00b

0

ただの推測。

x=array[x1range:x2range,y1range:y2range] 
+0

このコードはなぜ機能しますか?あなたはいくつかの文脈をあなたの答えに加えてください。 – ppperry

0

スライシングはどうですか?

array[x1range:x2range,y1range:y2range] 

例:

numpy.array([[1,2,3],[4,5,6],[7,8,9]])[0:2,0:2] 
array([[1, 2], 
     [4, 5]]) 
+0

こんにちは、私は追加の要件を追加しました。以前は言及してくれなかったことを申し訳ありません。私はwhere条件を探していたので、与えられた条件を満たすすべての要素の値を変更することができます。 – n00b

関連する問題