векторизация является неопределенной - PullRequest
1 голос
/ 12 марта 2010

Я пытаюсь векторизовать простую функцию в numpy и получить противоречивое поведение. Я ожидаю, что мой код вернет 0 для значений <0.5 и неизменное значение в противном случае. Как ни странно, разные запуски скрипта из командной строки дают разные результаты: иногда он работает правильно, а иногда я получаю все 0. Неважно, какую из трех строк я использую для случая, когда d <= T. Похоже, что это коррелирует с тем, является ли первое возвращаемое значение равным 0. Есть идеи? Спасибо. </p>

import numpy as np

def my_func(d, T=0.5):
    if d > T:   return d
    #if d <= T:  return 0
    else:  return 0
    #return 0

N = 4
A = np.random.uniform(size=N**2)
A.shape = (N,N)
print A
f = np.vectorize(my_func)
print f(A)

$ python x.py
[[ 0.86913815  0.96833127  0.54539153  0.46184594]
 [ 0.46550903  0.24645558  0.26988519  0.0959257 ]
 [ 0.73356391  0.69363161  0.57222389  0.98214089]
 [ 0.15789303  0.06803493  0.01601389  0.04735725]]
[[ 0.86913815  0.96833127  0.54539153  0.        ]
 [ 0.          0.          0.          0.        ]
 [ 0.73356391  0.69363161  0.57222389  0.98214089]
 [ 0.          0.          0.          0.        ]]
$ python x.py
[[ 0.37127366  0.77935622  0.74392301  0.92626644]
 [ 0.61639086  0.32584431  0.12345342  0.17392298]
 [ 0.03679475  0.00536863  0.60936931  0.12761859]
 [ 0.49091897  0.21261635  0.37063752  0.23578082]]
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]

1 Ответ

7 голосов
/ 12 марта 2010

Если это действительно проблема, которую вы хотите решить, то есть гораздо лучшее решение:

A[A<=0.5] = 0.0

Однако проблема с вашим кодом состоит в том, что если условие выполняется, вы возвращаете целое число 0, а не с плавающей точкой 0,0. Из документации:

Тип данных вывода vectorized определяется путем вызова функции с первым элементом ввода. Этого можно избежать, указав аргумент otypes.

Поэтому, когда самая первая запись - <0.5, она пытается создать массив целых чисел, а не чисел с плавающей точкой. Вы должны изменить return 0 на

return 0.0

В качестве альтернативы, если вы не хотите касаться my_func, вы можете использовать

f = np.vectorize(my_func, otypes=[np.float])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...