2017-09-17 8 views
1

私はこの解決策を書いています。しかし、これはPythonのプログラマーがやる方法でしょうか?Pythonでは、2dリストのすべての数字を10で割り、2dリストを返します。

a = [[2,3,4], [9,1,2]] 
print map(lambda(i): map(lambda(p): p/10.0,i), a) 

... 10の代わりに、ネストされた2dリストのすべての値の合計を使用したいとしたらどうなりますか?一般的にこのような場合には、ネストされたリスト-理解を内包表記を使用することによって解決だ

答えて

4

おそらく mapよりも高速だし、すべての lambda機能を回避
>>> from __future__ import division # for python-2.x compatibility 
>>> [[item/10 for item in subl] for subl in a] 
[[0.2, 0.3, 0.4], [0.9, 0.1, 0.2]] 

10の代わりに、ネストされた2dリストのすべての値の合計を使用したいとしたらどうなりますか?

sumを使用して合計し、ネストされたジェネレータ式計算:

>>> sum_ = sum(item for subl in a for item in subl) 
>>> [[item/sum_ for item in subl] for subl in a] 
[[0.09523809523809523, 0.14285714285714285, 0.19047619047619047], 
[0.42857142857142855, 0.047619047619047616, 0.09523809523809523]] 

しかし、それはさらに簡単ですnumpyのアレイとを。 numpyのサードパーティ製のパッケージが、非常に強力かつ高速:

>>> import numpy as np 
>>> arr = np.array(a) 
>>> arr/10. # element-wise division 
array([[ 0.2, 0.3, 0.4], 
     [ 0.9, 0.1, 0.2]]) 

>>> arr/arr.sum() # sum over all elements then element-wise division 
array([[ 0.0952381 , 0.14285714, 0.19047619], 
     [ 0.42857143, 0.04761905, 0.0952381 ]]) 
1

リストの内包表記がはるかにエレガントであり、(その読みやすくして)よりPython的であると考えられる。

>>> [[x/10.0 for x in lst] for lst in a] 
[[0.2, 0.3, 0.4], [0.9, 0.1, 0.2]] 

また、そのmapウォンに注意してくださいPython 3でリストを返さないと、iteratorオブジェクトを返します。マップオブジェクトごとにlistを呼び出して、それらをリストに評価させる必要があります。リストcompはバージョン間で同じ結果を返します。

2

もう1つの方法は、配列とその演算子がデフォルトで配列の各要素に作用するため、numpyを使用することです。

In [1]: import numpy as np 

In [2]: a = np.array([[2,3,4], [9,1,2]]) 

In [3]: a/10 
Out[3]: 
array([[ 0.2, 0.3, 0.4], 
     [ 0.9, 0.1, 0.2]]) 

、すべての数値の合計で割る私はnumpyのについて多くのことを聞く

In [6]: a/a.sum() 
Out[6]: 
array([[ 0.0952381 , 0.14285714, 0.19047619], 
     [ 0.42857143, 0.04761905, 0.0952381 ]]) 
+1

をすることができません。これが必要なのは残念だと思われますか?プラス私はその結果をリストにしたい。少なくとも私は私がそうすると思う... – pitosalas

+0

@pitosalasそれを使い始めると、多くのことに役立つでしょう。非常にコンパクトで高速な数値コードを多数作成することができます。そして、例えば、離散フーリエ変換のようなことも行うことができます。それは多次元リストとの作業を非常に簡単にします。 –

+0

上記の質問への私の更新に注意してください。 10で割るのではなく、すべての整数の和で除算したいのですが?それを正規化する? – pitosalas

関連する問題