1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
混合可能很棘手numpy;再加上由 .而不是基本數(shù)組類型sympy引起的潛在混淆。np.matndarray
總共
y_ = np.sum(np.dot(w,x)+b)
評(píng)估 sympy 對(duì)象上的 python/numpy 表達(dá)式。結(jié)果是一個(gè)同情的表達(dá)w*x+b。sympy 對(duì)象是標(biāo)量,因此它不編碼任何類型的矩陣乘法或數(shù)組求和。multiply表達(dá)式的計(jì)算方式相同。
然后,lambdify表達(dá)式將相同的內(nèi)容轉(zhuǎn)換為y_相同的 Python 函數(shù)。這種評(píng)估取決于np.mat論點(diǎn)的維度和類別。
細(xì)節(jié)
暫時(shí)忽略sympy部分:
In [310]: w = np.mat([1,1,1,1,1])
...: x= np.mat([1,1,1,1,1]).T
...: b = np.mat([0,0,0,0,0]).T
...: y = np.mat([6,6,6,6,6]).T
In [311]: np.sum(np.dot(w,x)+b)
Out[311]: 25
In [312]: np.multiply(w,x)+b
Out[312]:
matrix([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
因?yàn)樗鼈兪?,np.mat兩者都是 2d:wx
In [316]: w.shape
Out[316]: (1, 5)
In [317]: x.shape
Out[317]: (5, 1)
np.dot(1,5) 和 (5,1) 是 (1,1) 結(jié)果:
In [313]: np.dot(w,x)
Out[313]: matrix([[5]])
而對(duì)于np.matrix,*被定義為dot:
In [314]: w*x
Out[314]: matrix([[5]])
元素方面:
In [315]: np.multiply(w,x) # elementwise produces (5,5)
Out[315]:
matrix([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
np.sum(np.dot(w,x)+b)做dot, 然后添加b, 并以 asum結(jié)束所有元素。
np.multiply(w,x)+b這是否相乘,增加b。沒(méi)有sum。
更正
使用w.T我第一次錯(cuò)過(guò)的:
In [322]: np.multiply(w.T,x)
Out[322]:
matrix([[1],
[1],
[1],
[1],
[1]])
In [323]: w.T*x
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-323-11ad839cfa88> in <module>
----> 1 w.T*x
/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
218 if isinstance(other, (N.ndarray, list, tuple)) :
219 # This promotes 1-D vectors to row vectors
--> 220 return N.dot(self, asmatrix(other))
221 if isscalar(other) or not hasattr(other, '__rmul__') :
222 return N.dot(self, other)
<__array_function__ internals> in dot(*args, **kwargs)
ValueError: shapes (5,1) and (5,1) not aligned: 1 (dim 1) != 5 (dim 0)
np.multiply(5,1) 和 (5,1) 產(chǎn)生 (5,1),元素乘法
w.T*x是 的矩陣乘法np.mat,因此有np.dot誤差。
不鼓勵(lì)使用np.mat(如果沒(méi)有正式貶低)。此外消除了它的符號(hào)優(yōu)勢(shì)numpy。如果你堅(jiān)持使用基數(shù)組類,matmul/@生活會(huì)更簡(jiǎn)單, . 我意識(shí)到仍然使用二維矩陣概念,作為矩陣乘法。 numpyndarraysympy*
同情
在一個(gè)isympy會(huì)話中,我發(fā)現(xiàn)我需要定義w,x,b為符號(hào):
y_ = np.sum(np.dot(w,x)+b)
如果w,x,b只是符號(hào),它們是標(biāo)量,而不是矩陣或數(shù)組。你的np.sum(np.dot(1,2)+4),np.multiply(1,2)+4并且1*2+4都產(chǎn)生同樣的東西。只有當(dāng)變量是數(shù)組,或者np.mat,或者sympy.Matrix表達(dá)式不同時(shí)。
問(wèn)題不在于lambdify. 在這兩種情況下,它都是相同的y_(由 驗(yàn)證print(y_)。您會(huì)收到錯(cuò)誤,因?yàn)閰?shù)是np.mat,并且*是矩陣乘法。
帶x,y,z符號(hào):
In [55]: f = lambdify((x,y,z),x*y+z, 'numpy')
使用isympy內(nèi)?。?/p>
In [56]: f??
Signature: f(x, y, z)
Docstring:
Created with lambdify. Signature:
func(x, y, z)
Expression:
x*y + z
Source code:
def _lambdifygenerated(x, y, z):
return (x*y + z)
Imported modules:
Source:
def _lambdifygenerated(x, y, z):
return (x*y + z)
File: ~/mypy/<lambdifygenerated-4>
Type: function
閱讀lambdify. 請(qǐng)注意,它基本上是一個(gè)詞法替換
https://docs.sympy.org/latest/modules/utilities/lambdify.html
本文檔警告:
作為一般規(guī)則,NumPy 函數(shù)不知道如何對(duì) SymPy 表達(dá)式進(jìn)行操作,而 SymPy 函數(shù)也不知道如何對(duì) NumPy 數(shù)組進(jìn)行操作。這就是 lambdify 存在的原因:在 SymPy 和 NumPy 之間架起一座橋梁。
同化
https://docs.sympy.org/latest/modules/core.html#module-sympy.core.sympify
說(shuō)它使用eval. 定義x,y,z為符號(hào):
In [66]: eval('np.dot(x,y)+z')
Out[66]: x?y + z
In [67]: eval('np.sum(np.dot(x,y)+z)')
Out[67]: x?y + z
In [68]: eval('np.multiply(x,y)+z')
Out[68]: x?y + z
換句話說(shuō),它只是將符號(hào)傳遞給 numpy 函數(shù)(和/或運(yùn)算符),
In [69]: np.dot(x,y)
Out[69]: x?y
dot將其輸入轉(zhuǎn)換為數(shù)組:
In [70]: np.array(x)
Out[70]: array(x, dtype=object)
In [71]: np.dot(np.array(x), np.array(y))
Out[71]: x?y
這是有效的,因?yàn)榉?hào)定義了“*”和“+”。
sympy文檔警告說(shuō),評(píng)估numpy對(duì) sympy 對(duì)象一無(wú)所知。它將它們視為對(duì)象 dtype 數(shù)組,這可能會(huì)或可能不會(huì)起作用:
In [72]: sin(x) # sympy sin
Out[72]: sin(x)
In [73]: np.sin(x) # numpy sin
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
AttributeError: 'Symbol' object has no attribute 'sin'
The above exception was the direct cause of the following exception:
TypeError Traceback (most recent call last)
<ipython-input-73-92f2c2d0df9d> in <module>
----> 1 np.sin(x)
TypeError: loop of ufunc does not support argument 0 of type Symbol which has no callable sin method
np.sin執(zhí)行然后np.sin(np.array(x))將操作委托給不存在的sin方法。x
添加回答
舉報(bào)