2016-11-13 22 views
0

いくつかのブール値ステートメントで結果を再インデックスし、yに対応する要素を0に設定しようとしています。このインデックススキームをテストするために使用しているダミーコードを以下に示します。インデックス配列のインデックス作成時のNumpy配列の設定値

x=np.zeros([5,4])+0.1; 
y=x; 
print(x) 
m=np.array([0,2,3]); 
y[0:4,m][y[0:4,m]<0.5]=0; 
print(y) 

なぜ動作しないのか分かりません。出力は、私がしたい:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0.1 0.1 0.1 0.1]] 

しかし、私は実際に何を得る:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 

私はこれが動作しない理由を説明するいくつかのボンネット下の詳細を欠けていると確信しています。面白いことに、m:に置き換えると、割り当てが機能します。何らかの理由で列のサブセットを選択しても、ゼロを割り当てることはできません。

私の実際のyが本当に巨大になるので、誰かが何が起こっているのかを説明して、代わりの解決策を見つけることができれば(うまくいけば、一時的なnumpyアレイを生成することはできません)ありがとうございました!

EDIT: y[0:4,:][y[0:4,:]<0.5]=0; y[0:4,0:3][y[0:4,0:3]<0.5]=0; など

期待通りにすべての作業。問題は、あなたが何らかの種類のリストでインデックスを作成するときです。

+0

「0.1」の代わりに乱数を使用してもいいですか?入力として 'np.random.rand(5,4)'のようなものを使用して、期待される出力を見せてください。 – Divakar

+0

私が当初問題を遭遇したすべての乱数で元々テストしました。もっと再現性があったからといって、すべて「0.1」に切り替えました。 –

+0

最初に 'np.random.seed(1234)'を使って、再現可能な乱数を得ることができます。 – Divakar

答えて

0

配列(値が異なるので、これは私のお気に入りの一つです)してください:

In [845]: x=np.arange(12).reshape(3,4) 
In [846]: x 
Out[846]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [847]: m=np.array([0,2,3]) 
In [848]: x[:,m] 
Out[848]: 
array([[ 0, 2, 3], 
     [ 4, 6, 7], 
     [ 8, 10, 11]]) 
In [849]: x[:,m][:2,:]=0 
In [850]: x 
Out[850]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

変更なしに。しかし、私が1つのステップでインデックスを作成すると、それが変更されます。

In [853]: x[:2,:][:,m]=10 
In [854]: x 
Out[854]: 
array([[10, 1, 10, 10], 
     [10, 5, 10, 10], 
     [ 8, 9, 10, 11]]) 

x[i,j]x.__getitem__((i,j))として実行されます:私は順序を逆場合

In [851]: x[:2,m]=0 
In [852]: x 
Out[852]: 
array([[ 0, 1, 0, 0], 
     [ 0, 5, 0, 0], 
     [ 8, 9, 10, 11]]) 

は、それも動作します。 x[i,j]=vとしてx.__setitem__((i,j),v)

x[i,j][k,l]=vは、x.__getitem__((i,j)).__setitem__((k,l),v)です。

setは、getによって生成された値に適用されます。 getがビューを返す場合、変更はxに影響します。コピーが作成されても、変更はxには影響しません。

配列mの場合、y[0:4,m]がコピーを生成します(これを実証する必要がありますか?)。 y[0:4,:]ビューが作成されます。

つまり、最初の索引付けによってビューが作成されると、2番目の索引付けが機能します。しかし、コピーを作成した場合、2番目のコピーは効果がありません。

+0

これは意味があります、ありがとうございます。私の場合、1つのインデックス作成ステップで何をしたいのですか? –

関連する問題