2017-06-29 71 views
-2

在Python阵列比方说,我有这个计算的事情:矩阵和使用np.array

The law I am trying to apply to calculate xd and yd

什么是做在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循环(我知道我可以使用列表推导更快)。

+0

您可以提供[MCVE](http://stackoverflow.com/help/mcve)吗? – Nuageux

+0

使用['numpy.dot'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)进行矩阵向量乘法运算。 '*'运算符通过[broadcast](https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html)执行元素相乘。 –

+0

'()'创建一个序列,你应该在你的数组元素周围使用'[]'。另外如果你正在尝试使用'mat_name.dot(vector_name)'来进行矩阵乘法。快速浏览一下'E = np.array([[C,D],[E,F]])。dot(np.array([i,u]))+ np.array([Cx,Cy]) '应该足够了。 –

回答

1

如果你想有一个接近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 = [email protected]+v2 # python version > 3.5 with the new dot operator @ 
+2

的确如此,但我认为你应该编辑包含正确的方法来做到这一点,因为它们更常见,并且OP可能会在未来遇到它们。 –

+0

[使用数组](https://docs.scipy。org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use),而不是矩阵! –

0

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

  1. 您使用圆形的,而不是方括号 - 你有一个列表的列表养活numpy的的二维数组[[a0, a1],[a2, a3]]。这是您的ValueError从何而来。
  2. 您使用的是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]]) 
0

您可以使用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) 
+0

''np.einsum()'与''ndarray.dot()'或''''np.matrix'变量相比,有什么好处? –

+0

对于大矩阵,'.dot()'比'einsum('mk,k-> m')'快,'einsum()'和''+ V'中的广播速度快于Python'为'循环。 –