只是警告,这段代码很难看。我知道有更好的方法可以做到这一点,但这只是一个练习。
我正在尝试使用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)
答案 0 :(得分:3)
他们发出的问题是你的count
函数没有返回任何内容。在Python中与返回None
相同。
因此,当您运行长嵌套语句时,您会从最里面的None
调用中获取map
值列表:map(count, range(0, LEN))
。第一个None
值会在传递给最里面的lambda表达式时导致异常,并尝试将其乘以浮点数。
因此,您需要使用其他内容作为大型嵌套结构的最内层值,或者您需要修复count
以返回某些内容。我不清楚你打算迭代什么,所以我无法提供一个可靠的建议。也许是freqs
?
另外,我建议避免map
当你只想运行一个函数但不关心结果时。相反,写一个明确的for
循环。这在Python 3中很重要,其中map
返回一个生成器(在迭代它之前它不会执行任何操作)。