Использование numpy.apply - PullRequest
       13

Использование numpy.apply

2 голосов
/ 29 марта 2010

Что не так с этим фрагментом кода?

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

Есть идеи?

1 Ответ

1 голос
/ 29 марта 2010

cutoffs - это список. Числа, которые вы извлекаете из d, превращаются в float и применяются с использованием numpy.vectorize. (На самом деле это довольно странно - похоже, что сначала он пытается использовать пустые числа с плавающей точкой, которые работают так, как вы хотите, затем он пытается использовать обычные операции с плавающей точкой 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.vectorize, но я не знаю, что это было не по порядку.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...