In [269]: import math
In [270]: w1=2
...: b1=0.5
...: b2=0.75
...: X=[[0, 1, 1, 1], [1, 1, 1, 1]]
...: y=(np.dot(w1,X)-b1)
In [271]: X
Out[271]: [[0, 1, 1, 1], [1, 1, 1, 1]]
In [273]: y
Out[273]:
array([[-0.5, 1.5, 1.5, 1.5],
[ 1.5, 1.5, 1.5, 1.5]])
Python оценивает аргумент в np.vectorize
перед вызовом vectorize
. Это должна быть функция, но то, что вы написали, было выражением.
Ошибка возникает в:
In [274]: math.exp(-2*y)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-274-02e40bf10b29> in <module>
----> 1 math.exp(-2*y)
TypeError: only size-1 arrays can be converted to Python scalars
y
- массив;math.exp
работает только со скалярными значениями. np.exp
работает с массивами:
In [275]: np.exp(-2*y)
Out[275]:
array([[2.71828183, 0.04978707, 0.04978707, 0.04978707],
[0.04978707, 0.04978707, 0.04978707, 0.04978707]])
С lambda
vectorize
работает:
In [276]: fn = np.vectorize( lambda z: (1-math.exp(-2*z))/(1+math.exp(-2*z)))
In [277]: fn(y)
Out[277]:
array([[-0.46211716, 0.90514825, 0.90514825, 0.90514825],
[ 0.90514825, 0.90514825, 0.90514825, 0.90514825]])
vectorize
перебирает y
и передает элемент, одинза один раз, до lambda
как z
.
, но это быстрее:
In [278]: (1-np.exp(-2*y))/(1+np.exp(-2*y))
Out[278]:
array([[-0.46211716, 0.90514825, 0.90514825, 0.90514825],
[ 0.90514825, 0.90514825, 0.90514825, 0.90514825]])
vectorize
по сути является вариацией в этом понимании списка:
In [280]: [ (1-math.exp(-2*z))/(1+math.exp(-2*z)) for z in y.ravel()]
Out[280]:
[-0.46211715726000974,
0.9051482536448665,
0.9051482536448665,
0.9051482536448665,
0.9051482536448665,
0.9051482536448665,
0.9051482536448665,
0.9051482536448665]