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 に答える