Python中使用np.array的矩阵和数组
假设我要做这个计算: 在Python中,最好的方法是什么?我来自Matlab背景,Matlab中的矩阵很容易处理。我已尝试使用numpy,但它显示以下错误消息:Python中使用np.array的矩阵和数组,python,arrays,math,matrix,np,Python,Arrays,Math,Matrix,Np,假设我要做这个计算: 在Python中,最好的方法是什么?我来自Matlab背景,Matlab中的矩阵很容易处理。我已尝试使用numpy,但它显示以下错误消息: ValueError:设置带有序列的数组元素。 以下是我的代码片段: 以Xh表示的i的: 对于Yh中的u: E=(np.数组([(C,D),(E,F)])*np.数组([(i),(u)])+np.数组([Cx,Cy]) 请注意,Xh和Yh是已经计算过的列表,这就是我使用for循环的原因(我知道我可以通过列表理解更快) 编辑:这是我
ValueError:设置带有序列的数组元素。
以下是我的代码片段:
以Xh表示的i的:
对于Yh中的u:
E=(np.数组([(C,D),(E,F)])*np.数组([(i),(u)])+np.数组([Cx,Cy])
请注意,Xh
和Yh
是已经计算过的列表,这就是我使用for循环的原因(我知道我可以通过列表理解更快)
编辑:这是我从这个主题中得到的一个很好的解决方案,效果非常好。对于任何面临同样问题的人来说,这可能会有所帮助
a = np.matrix([[1,2],[3,4]])
v1 = np.matrix([[0],[1]])
v2 = np.matrix([[1],[1]])
res = np.dot(a,v1)+v2 # python version <= 3.5
res = a@v1+v2 # python version > 3.5 with the new dot operator @
a=np.矩阵([[1,2],[3,4]]
v1=np.矩阵([[0],[1]])
v2=np.矩阵([[1],[1]])
res=np.dot(a,v1)+v2#python版本3.5,带有新的点运算符@
如果您想拥有接近matlab的经验,可以使用np.matrix而不是np.array。你的数学例子是,例如
a = np.matrix([[1,2],[3,4]])
v1 = np.matrix([[0],[1]])
v2 = np.matrix([[1],[1]])
res = a*v1+v2
然而,正如评论中所指出的,numpy文档并不推荐这样做。使用数组执行此操作的方法非常类似。然而,这里*是元素乘法(*在matlab中)。然后,可以使用以下方法进行矩阵乘法:
a = np.matrix([[1,2],[3,4]])
v1 = np.matrix([[0],[1]])
v2 = np.matrix([[1],[1]])
res = np.dot(a,v1)+v2 # python version <= 3.5
res = a@v1+v2 # python version > 3.5 with the new dot operator @
a=np.矩阵([[1,2],[3,4]]
v1=np.矩阵([[0],[1]])
v2=np.矩阵([[1],[1]])
res=np.dot(a,v1)+v2#python版本3.5,带有新的点运算符@
我在您的代码中发现了两个问题:
[[a0,a1],[a2,a3]
。这就是您的ValueError
的来源m1*m2
,这是元素点积,但您应该使用矩阵点积np.dot(m1,m2)
或其等效形式m1.dot(m2)
for i in Xh:
for u in Yh:
E = np.dot(np.array([[C, D], [E, F]]), np.array([[i], [u]])) + np.array([[Cx], [Cy]])
您可以使用,然后np.einsum
并在此处进行广播,以在一行中对整个操作进行矢量化(读取:加速100倍):
import numpy as np
C, D, E, F = 1, 2, 3, 4
Cx, Cy = 1, 2
Xh = [1, 2, 3]
Yh = [4, 5, 6]
XhYh = np.array(np.meshgrid(Xh, Yh)).T.reshape(-1, 2)
M = np.array([[C, D], [E, F]])
V = np.array([Cx, Cy])
E = np.einsum('mk,fk->fm', M, XhYh) + V
100000XhYh
条目的速度比较:
%timeit np.einsum('mk,fk->fm', M, XhYh) + V
# 209 µs ± 2.51 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.array([M.dot(np.array([x, y])) + V for x in Xh for y in Yh])
# 32.5 ms ± 608 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
你能提供一个矩阵向量乘法的?用法吗。
*
运算符通过执行元素相乘。()
创建一个序列,您应该在数组元素周围使用[]
。另外,如果您试图进行矩阵乘法,请使用mat\u name.dot(vector\u name)
。快速浏览一下E=np.array([[C,D],[E,F]]).dot(np.array([i,u])+np.array([Cx,Cy])
就足够了。没错,但我认为你也应该编辑以包含正确的方法来处理数组,因为它们更常见,而且OP将来可能会遇到它们,而不是矩阵!np.einsum()
比ndarray.dot()
使用或*
使用np.matrix
变量有什么好处?而对于大型矩阵.dot()
比einsum('mk,k->m')
,einsum()
和使用中的广播更快V
比Pythonfor
循环快。