Трансляция массива Numpy с векторными параметрами - PullRequest
2 голосов
/ 26 октября 2010

Можно ли выполнять массивную трансляцию в numpy с параметрами, которые являются векторами?

Например, я знаю, что могу это сделать

def bernoulli_fraction_to_logodds(fraction):
    if fraction == 1.0:
        return inf
    return log(fraction / (1 - fraction))
bernoulli_fraction_to_logodds = numpy.frompyfunc(bernoulli_fraction_to_logodds, 1, 1)

и он будет работать со всем массивом. Что делать, если у меня есть функция, которая принимает 2-элементный вектор и возвращает 2-элементный вектор. Могу ли я передать ему массив 2-элементных векторов? Например.,

def beta_ml_fraction(beta):
    a = beta[0]
    b = beta[1]
    return a / (a + b)
beta_ml_fraction = numpy.frompyfunc(beta_ml_fraction, 1, 1)

К сожалению, это не работает. Есть ли аналогичная функция from_py_func, которая работает. Я могу разобраться с этим, когда они являются 2-элементными векторами, но что делать, когда они являются n-элементными векторами?

Таким образом, ввод (2,3) должен дать 0.4, а ввод [[2,3], [3,3]] должен дать [0.4, 0.5].

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Я не думаю, что frompyfunc может это сделать, хотя я могу ошибаться.

Относительно np.vectorize A. М. Арчибальд написал :

На самом деле, все, что проходит код Python для "объединить два Скаляры »будет медленным. Медлительность зацикливание в питоне не потому, что петлевые конструкции Python являются медленными, это потому, что выполнение кода Python медленный. Так что векторизация это своего рода обман - на самом деле он не работает быстро, но это удобно.

Так что np.frompyfuncnp.vectorize) - просто синтаксический сахар - они не заставляют Python-функции работать быстрее. После осознания этого мой интерес к frompyfunc снизился (почти до нуля).

В цикле Python нет ничего нечитаемого, поэтому либо используйте его явно, или переписать функцию, чтобы действительно использовать numpy (написав по-настоящему векторизованные уравнения).

import numpy as np

def beta_ml_fraction(beta):    
    a = beta[:,0]
    b = beta[:,1]
    return a / (a + b)


arr=np.array([(2,3)],dtype=np.float)
print(beta_ml_fraction(arr))
# [ 0.4]

arr=np.array([(2,3),(3,3)],dtype=np.float)
print(beta_ml_fraction(arr))
# [ 0.4  0.5]
1 голос
/ 27 октября 2010

При работе с двумерным векторным массивом мне нравится сохранять компоненты x и y в качестве первого индекса.Для этого я активно использую функцию transpose ()

def beta_ml_fraction(beta):
        a = beta[0]
        b = beta[1]
   return a / (a + b)

arr=np.array([(2,3),(3,3)],dtype=np.float) 
print(beta_ml_fraction(arr.transpose()))
# [ 0.4  0.5]

. Преимущество этого подхода состоит в том, что обработка многомерного массива двумерного вектора становится проще.

x = np.arange(18,dtype=np.float).reshape(2,3,3)
print(x)
#array([[[  0.,   1.,   2.],
#        [  3.,   4.,   5.],
#        [  6.,   7.,   8.]],
#
#       [[  9.,  10.,  11.],
#        [ 12.,  13.,  14.],
#        [ 15.,  16.,  17.]]])
print(beta_ml_fraction(x))
#array([[ 0.        ,  0.09090909,  0.15384615],
#       [ 0.2       ,  0.23529412,  0.26315789],
#       [ 0.28571429,  0.30434783,  0.32      ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...