Синтаксис Numpy для линейного уравнения


Я новичок в numpy, но не в python. У вас есть вопрос о numpy способе сделать это, рассмотрим:

Edit : исправление функции* *

def _my_function(weights, features, bias):
    # the pure python way
    value = 0.
    for i in range(len(weights)):
         value += (weights[i]*features[i])

    return value+bias

Как это сделать с помощью numpy?

2 3

2 ответа:

Если weigths и features являются массивами numpy одинакового размера, можно выполнить элементарное умножение:

values = np.sum(weights * features + bias)

Если вы хотите избежать добавления смещения к каждому элементу массива product, вы можете сделать

values = np.sum(weights * features) + bias * weights.size

Вы даже можете использовать встроенную функцию Python sum:

values = sum(weights * features + bias)

Или

values = sum(weights * features) + bias * weights.size

Причина, по которой это работает, заключается в том, что выражения weights * features и weights * features + bias являются временными массивами numpy, которые итеративны вдоль их первого измерения и поэтому могут быть переданы в sum.

Время

Я провел следующие временные тесты в IPython:

%timeit weights.dot(features)
The slowest run took 145.86 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 649 ns per loop

%timeit np.sum(weights * features)
The slowest run took 17.09 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.83 µs per loop

Использование ndarray.dot происходит на порядок быстрее, чем использование np.sum на продукте. Однако предупреждение указывает, что это может быть не так при первом запуске кода. 0.649 МКСМ * 145.86 = 94.66 МКС, а МКС 2.83 * 17.09 = 48.36 МКС.

Подход №1: использование dot-product с np.dot -

weights.dot(features) + bias*len(weights)

Подход №2: привлечение np.einsum для выполнения sum-reduction -

np.einsum('i,i->',weights,features) + bias*len(weights)

Я думаю, что подход № 1 будет лучшим.