TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python, полученные во время простой программы - PullRequest
0 голосов
/ 18 октября 2019

Когда я попробовал этот код,

from math import exp
import numpy as np

w1=2
b1=0.5
b2=0.75

X=[[0, 1, 1, 1], [1, 1, 1, 1]]
y=(np.dot(w1,X)-b1)
tanh=np.vectorize((1-exp(-2*y))/(1+exp(-2*y)))
y_out=1/(1+np.exp(-tanh))-b2 

print(y_out)

Я получил эту ошибку:

TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python ..

Где я ошибаюсь?

1 Ответ

0 голосов
/ 18 октября 2019
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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...