Numpy Arange и где - PullRequest
       12

Numpy Arange и где

4 голосов
/ 06 января 2011

Я пытаюсь найти значения в массиве, созданном «arange» с помощью «где», но, похоже, он не работает нормально. Вот один пример:

from numpy import arange, where

myarr = arange(6.6,10.25,0.05)
for item in [6.6,6.65,6.7,6.8,6.9,6.95,7.95,8.0,8.1,8.15,6.2,6.25,6.35]:
 print where(myarr == item)

(array([0]),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)

Использование Python 2.5.4, Numpy 1.3.0

Заранее спасибо!

1 Ответ

6 голосов
/ 06 января 2011

Примечание:

In [32]: repr(myarr[1])
Out[32]: '6.6499999999999995'

In [33]: repr(6.65)
Out[33]: '6.6500000000000004'

Так что значение float64, которое np.arange присваивает myarr[1], не совсем то же самое, что Python использует для представления 6.65.

Итак, если вы действительно не знаете, что делаете, никогда не проверяет поплавки на равенство . Вместо этого используйте неравенства:

def near(a,b,rtol=1e-5,atol=1e-8):
    try:
        return np.abs(a-b)<(atol+rtol*np.abs(b))
    except TypeError:
        return False

myarr = np.arange(6.6,10.25,0.05)
for item in [6.6,6.65,6.7,6.8,6.9,6.95,7.95,8.0,8.1,8.15,6.2,6.25,6.35]:
    print (np.where(near(myarr,item)))

# (array([0]),)
# (array([1]),)
# (array([2]),)
# (array([4]),)
# (array([6]),)
# (array([7]),)
# (array([27]),)
# (array([28]),)
# (array([30]),)
# (array([31]),)
# (array([], dtype=int32),)
# (array([], dtype=int32),)
# (array([], dtype=int32),)
...