Python 使用numpy.apply

Python 使用numpy.apply,python,numpy,scipy,Python,Numpy,Scipy,这段代码有什么问题 import numpy as np from scipy import stats d = np.arange(10.0) cutoffs = [stats.scoreatpercentile(d, pct) for pct in range(0, 100, 20)] f = lambda x: np.sum(x > cutoffs) fv = np.vectorize(f) # why don't these two lines output the same

这段代码有什么问题

import numpy as np
from scipy import stats

d = np.arange(10.0)
cutoffs = [stats.scoreatpercentile(d, pct) for pct in range(0, 100, 20)]
f = lambda x: np.sum(x > cutoffs)
fv = np.vectorize(f)

# why don't these two lines output the same values?
[f(x) for x in d] # => [0, 1, 2, 2, 3, 3, 4, 4, 5, 5]
fv(d)             # => array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

有什么想法吗?

截止日期是一个列表。从
d
中提取的数字都转换为
float
,并使用
numpy.vectorize
应用。(实际上这很奇怪,它看起来像是先尝试numpy浮点数,然后再尝试普通的Python浮点数。)通过Python中一种非常奇怪、愚蠢的行为,浮点数总是小于列表,因此它没有得到类似的结果

>>> # Here is a vectorized array operation, like you get from numpy. It won't
>>> # happen if you just use a float and a list.
>>> 2.0 > [0.0, 1.8, 3.6, 5.4, 7.2]
[True, True, False, False, False] # not real
你得到

>>> # This is an actual copy-paste from a Python interpreter
>>> 2.0 > [0.0, 1.8, 3.6, 5.4, 7.2]
False

要解决此问题,可以将
截止值
设置为一个numpy数组,而不是
列表
。(你也可以将比较完全转移到numpy操作中,而不是用
numpy.vectorize
,但我现在不知道。)

“float总是小于list”并不明显是“愚蠢的”:你如何比较无法比较的东西?(像苹果和想法)你没有,这就是为什么这应该引起一个例外。(在3.x中,比较一个列表和一个浮点数将产生
TypeError
,从而认识到Python不应该做毫无意义的事情。)