2016-10-12 12 views
0

MATLABの "cellfun"に似たPythonまたはNumpyアプローチがありますか? 〜300kセルの長さが異なるMATLABセル配列であるオブジェクトに関数を適用したい。MATLABの "cellfun"へのPythonまたはNumpyアプローチ

非常に単純な例:

>>> xx = [(4,2), (1,2,3)] 
>>> yy = np.exp(xx) 

Traceback (most recent call last): 
File "<pyshell#47>", line 1, in <module> 
yy = np.exp(xx) 
AttributeError: 'tuple' object has no attribute 'exp' 

答えて

3

最も読みやすい/保守性のアプローチは、おそらくlist comprehensionを使用するようになります。

yy = [ np.exp(xxi) for xxi in xx ] 

暗黙的numpy.ndarrayに各タプルを変換するnumpy.expに依存していること、これはタプルのリストではなくnumpy.ndarrayのリストを取得することを意味します。それは、ほぼすべての目的のために、おそらくOKですが、あなたは絶対にもアレンジするのは簡単だタプル持つようにしている場合:(例:メモリのボトルネックを回避するため)いくつかの目的のために

yy = [ tuple(np.exp(xxi)) for xxi in xx ] 

をあなたはgenerator expressionではなく、使用することを好むかもしれませんリストの理解(四角の代わりに角かっこ)。

+0

また、np.expよりもmath.expではなく、np.expを使用することを検討したい場合があります。 –

+0

@LewisFogdenでも可能ですが、内側のタプルを明示的に反復処理する必要があります外側のリストと同様です。 – jez

2

MATLABセルは、実際の言語のような一般的なリストを処理しようとしました。しかし、MATLABであるためには2次元でなければなりません。しかし一般的に、Pythonでは、MATLABがセルを使用するリストを使用します。 numpydtype=objectの配列も同様に動作し、多次元を追加します。 (最初に、結果が第2ケース(2,2)で

In [231]: np.frompyfunc(np.exp,1,1)([(4,2),(1,2,3)]) 
Out[231]: 
array([array([ 54.59815003, 7.3890561 ]), 
     array([ 2.71828183, 7.3890561 , 20.08553692])], dtype=object) 
In [232]: np.frompyfunc(np.exp,1,1)([(4,2),(1,2)]) 
Out[232]: 
array([[54.598150033144236, 7.3890560989306504], 
     [2.7182818284590451, 7.3890560989306504]], dtype=object) 

オブジェクトアレイルートを取って、私は、リストの要素または配列に、この機能を適用するfrompyfuncを使用することができ2、)形状を有する。これは、np.array([...])がこれらの2つの入力をどのように処理するのかによるものです。

リスト内包表記も同様に高速で、おそらくより優れた制御を提供します。あるいは、少なくとも予測可能なことがあります。

関連する問題