使用np.array的Python中的矩阵和数组

时间:2017-06-29 13:19:59

标签: python arrays math matrix np

让我说我有这个计算:

atoi

在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])

请注意,XhYh是已经计算过的列表,这就是我使用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 @

3 个答案:

答案 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)

我在你的代码中发现了两个问题:

  1. 您使用圆形而不是方括号 - 您必须使用列表[[a0, a1],[a2, a3]]为numpy的2d数组提供数据。这是ValueError来自的地方。
  2. 您使用m1 * m2,这是元素点积,但您应该使用矩阵点积np.dot(m1,m2)或其等效形式m1.dot(m2)
  3. 修正:

    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)