2017-08-02 14 views
1

私は完全に機能する関数を持っています。それはnumpy 2D配列をとり、配列で何かをしてから戻します。 返された値を使用して配列を条件で満たすことを試みています。以下のコードをご覧ください:numpy配列の2D配列関数の戻り値の割り当て

>>> import numpy as np 
>>> x=np.random.randint(20, size=(4,5)) 
>>> y=np.zeros_like(x) * np.nan 
>>> x 
array([[19, 0, 6, 17, 5], 
     [18, 18, 10, 19, 9], 
     [ 2, 5, 10, 5, 15], 
     [ 9, 3, 0, 6, 9]]) 
>>> y 
array([[ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan]]) 
>>> y[ x>15 ] = 1000 
>>> y 
array([[ 1000., nan, nan, 1000., nan], 
     [ 1000., 1000., nan, 1000., nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan]]) 

問題は次のような機能を追加するときです。

>>> def foo(x): 
    return x*2 

>>> y[ x>15 ] = foo(x) 

Warning (from warnings module): 
    File "__main__", line 1 
FutureWarning: assignment exception type will change in the future 
Traceback (most recent call last): 
    File "<pyshell#59>", line 1, in <module> 
    y[ x>15 ] = foo(x) 
ValueError: boolean index array should have 1 dimension 

かのような何か:

>>> _=foo(x) 
>>> y[ x>15 ]=_ 
Traceback (most recent call last): 
    File "<pyshell#64>", line 1, in <module> 
    y[ x>15 ]=_ 
ValueError: boolean index array should have 1 dimension 

それはもはや機能しない理由!

+0

なぜ0の代わりにnanの行列が必要なのですか? –

+2

あなたの最初の試みではスカラーを使います。 2番目の配列には2D配列があります。それらのサイズは一致しません。 'np.where(x> 15、foo(x)、y)'を使うことができます。 – ayhan

+0

@IgnacioVergaraKausel私はいくつかの条件があります。それらのうちの1つでは、yは0でなければならず、他のyでは1でなければならず、そうでなければyは必ずナノでなければならない。私はナンが必要です。 –

答えて

2

あなたの主要な問題は、ブール・インデックス付きの配列は、そう、1次元配列を返すということです。

y[x > 15] 
[Out]: array([nan, nan, nan, nan, nan]) 

あなたがそれに割り当てたいのであれば、あなたは、同じサイズ(または何かの1次元配列を必要とします最初の例のように0dスカラーのように1dにブロードキャストします)。

だから、どちらかのブールスライス形状を保持し、あなたの入力

y[x > 15] = foo(x[x > 15]) # or 
y[x > 15] = foo(x)[x > 15] 

または使用np.where、。

y = np.where(x > 15, foo(x), y) 

最初のオプションは高速ですが、np.whereは、一般的に、より明確かつ拡張可能です。

関連する問題