Domanda

Cosa c'è di sbagliato in questo frammento di codice?

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

Tutte le idee?

È stato utile?

Soluzione

cutoffs è una lista. I numeri di estrarre da d sono tutti trasformati in float e applicate utilizzando numpy.vectorize. (In realtà è piuttosto strano, sembra che prima si cerca carri NumPy che funzionano come si desidera quindi tenta normali carri Python.) Con un po 'strano, comportamento stupido in Python, carri sono sempre meno di liste, per cui invece di ottenere le cose come

>>> # 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

si ottiene

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

Per risolvere il problema, è possibile effettuare un allineamento cutoffs NumPy invece di un list. (Probabilmente si può anche spostare il confronto nelle operazioni NumPy del tutto invece di fingere con numpy.vectorize, ma non so estemporaneo.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top