2

这段代码有什么问题?

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])

有任何想法吗?

4

1 回答 1

1

cutoffs是一个列表。您从中提取的数字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

要解决此问题,您可以创建cutoffs一个 numpy 数组而不是list. (您也可以将比较完全转移到 numpy 操作中numpy.vectorize,而不是用 .

于 2010-03-29T03:27:45.650 回答