2016-04-12 1 views
0

同じ種類のオブジェクト、特に様々なLinearNDInterpolatorオブジェクトを格納するndarray Aがあります。たとえば、それはちょうど2と仮定しています:numpyオブジェクト配列のいくつかの要素を評価する

>>> A 
array([ <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe122adc750>, 
     <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe11daee590>], dtype=object) 

私は2つのことをしたいです。まず、ある点でAのすべてのオブジェクトを評価し、その中のすべての値を持つA.shapeのndarrayを取得したいと思います。しかし

>> A[[0,1]](1,1) = 
array([ 1, 2]) 

ような何か、私は

TypeError: 'numpy.ndarray' object is not callable 

はそれを行うことが可能になってしまいますか?

第2に、新しいLinearNDInterpolatorオブジェクトを構築せずに(ノードは同じままであるため)、補間値を変更したいと思います。すなわち、BはA.

のすべての要素の新しい値を含むndarrayある

A[[0,1]].values = B 

のようなものをご提案いただきありがとうございます。

答えて

1

同じ問題が、簡単な関数で:

In [221]: A=np.array([add,multiply]) 

In [222]: A[0](1,2) # individual elements can be called 
Out[222]: 3 

In [223]: A(1,2) # but not the array as a whole 
---------------------------------------------------------------------------  
TypeError: 'numpy.ndarray' object is not callable 

私たちは、パラメータの各要素を呼び出し、同様の機能のリスト、またはその配列を反復処理することができます。直ちに、関数のリストとパラメータのリストを圧縮することもできます。

In [224]: ll=[add,multiply] 

In [225]: [x(1,2) for x in ll] 
Out[225]: [3, 2] 

In [226]: [x(1,2) for x in A] 
Out[226]: [3, 2] 

別のテスト、callable機能:

In [229]: callable(A) 
Out[229]: False 

In [230]: callable(A[0]) 
Out[230]: True 

あなたは、個々のインターポレータの補間値を変更することはできますか?もしそうなら、リストを反復してそれを行うだけです。

一般に、dtypeオブジェクト配列はリストのように機能します。それらには同じ種類のオブジェクトポインタが含まれています。ほとんどの操作では、同じ種類の反復が必要です。複数の次元で要素を整理する必要がない限り、dtypeオブジェクト配列はリストよりも利点がある場合はほとんどありません。

別の考え方 - 通常の配列dtypeは、数値または固定長の文字列です。これらの要素は呼び出し可能ではないので、これらの配列に.__call__メソッドを実装する必要はありません。彼らはオブジェクトdtype配列で動作するようなものを書くことができますが、コアアクションはPython呼び出しです。そのような関数は、私が概説したような反復の種類を隠すだけです。

別の最近の質問では、np.char.upperを使用して、S dtype配列のすべての要素に文字列メソッドを適用する方法を示しました。しかし、私の時間テストは、これは何も高速化していないことを示しました。

+0

お返事ありがとうございます。問題は、配列がn次元であるため、リストやループで作業するのは面倒です。私はnumpy.frompyfuncを使って最初のことを行うことができました。eval_element = lambda array:array(1,1)を定義し、次にeval_ufunc = np.frompyfunc(eval_element、1、1)を定義することができます。 eval_ufunc(A)は、(1,1)で評価された各LinearNDinterpolatorのndarrayを返します。 – Tobias

+0

はい、インターポレーターの値を変更することができます。これらの値はA [0] .values属性に格納されています。 – Tobias

+0

'frompyfunc'は評価されていません。私はいくつかのSOの答えでそれを使用しました。 http://stackoverflow.com/a/36297194/901925 – hpaulj