質問

このコードのスニペットを使って何が悪いの?

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

任意のアイデア?

役に立ちましたか?

解決

cutoffsリストです。あなたはdから抽出の数字は、すべてのfloatになって、numpy.vectorizeを使用して適用されます。 (それはむしろ奇数、それは実際にだ最初のように、それはあなたが望むような作業が、それはPythonが浮く通常試みることnumpyの山車をしようと見えます。)奇妙では、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
問題を解決するために、あなたの代わりにcutoffslist numpyの配列を作ることができます。 (おそらく代わりnumpy.vectorizeでそれを偽造し、まったくnumpyの操作に比較して移動することもできますが、私はぶっきらぼう知りません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top