让我说我有这个计算:
在Python中执行此操作的最佳方法是什么?我来自Matlab背景,Matlab中的矩阵很容易处理。我尝试了 numpy ,但它给了我这个错误消息:
ValueError: setting an array element with a sequence.
以下是我的代码片段:
for i in Xh:
for u in Yh:
E= (np.array([(C,D),(E,F)]) * np.array([(i),(u)]) ) + np.array([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 @
答案 0 :(得分:2)
如果您希望获得接近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 @
答案 1 :(得分:1)
我在你的代码中发现了两个问题:
[[a0, a1],[a2, a3]]
为numpy的2d数组提供数据。这是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]])
答案 2 :(得分:1)
您可以使用np.meshgrid
to produce all combinations of Xh
and Yh
,然后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
100000 XhYh
条目的速度比较:
%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)