-2

警告です。このコードは醜いです。これを行うためのより良い方法があることは知っていますが、これは単なる演習です。

私はPythonの関数型プログラミング側をいじっていますが、いくつかの関数呼び出しをネストしようとするとエラーが発生し続けます:

LEN = 4
def calcentropy(i):
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), map(count, range(0,LEN)))))
map(calcentropy, range(0,LEN))

タイプが一致しないというエラー メッセージが表示されます。range() への最後の呼び出しの float および None: TypeError: サポートされていないオペランド型 (*: 'NoneType' および 'float')

次のようなことをすると:

LEN = 4
def calcFreqs(i): do stuff to freqs
map(calcFreqs, range(0, LEN)
def calcentropy(i):
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), freqs))))
map(calcentropy, range(0,LEN))

問題はありません。

問題は、LEN が range() の呼び出しの範囲内になくなったことだと思います。これを修正する方法はありますか、または何らかの制限を超えましたか? もしそうなら、それは何でしたか?

十分なコードを追加していないことをお詫びします。私の間違いです:

import numpy as np
LEN = 4
freqs = np.zeros(4 * LEN, dtype = np.float64)
sites = np.array([0,1,2,3,0,1,2,3,0,1,2,3], dtype = np.int8)
A = np.int8(0)
C = np.int8(1)
G = np.int8(2)
T = np.int8(3)
def count(i):
    freqs[i * LEN + A] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN]))
    freqs[i * LEN + C] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN]))
    freqs[i * LEN + G] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN]))
    freqs[i * LEN + T] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN]))
entropy = np.zeros(LEN, dtype = np.float64)
def calcentropy(i):
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), map(count, range(0,LEN)))))
map(calcentropy, range(0,LEN))
print entropy
info   = map(lambda x: 2-x, entropy)    
4

1 に答える 1

3

あなたが抱えている問題は、count関数が何も返さないということです。Python では、 を返すことと同じNoneです。

したがって、ネストされた長いステートメントを実行するとNone、最も内側のmap呼び出しから値のリストが返されます: map(count, range(0, LEN)). 最初のNone値は、最も内側のラムダ式に渡され、浮動小数点数で乗算しようとすると例外が発生します。

そのため、ネストされた大きな構造の最も内側の値として別のものを使用するか、count何かを返すように修正する必要があります。何を反復しようとしているのかがはっきりしないので、確かな提案をすることはできません。おそらくfreqs

また、map単に関数を何度も実行したいが、結果は気にしない場合は避けることをお勧めします。代わりに、明示的なforループを記述します。これは、ジェネレーターを返す Python 3 で重要ですmap(これは、反復処理を行うまで何もしません)。

于 2012-12-04T20:24:27.057 に答える