Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中使用np.array的矩阵和数组_Python_Arrays_Math_Matrix_Np - Fatal编程技术网

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

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循环的原因(我知道我可以通过列表理解更快) 编辑:这是我

假设我要做这个计算:

在Python中,最好的方法是什么?我来自Matlab背景,Matlab中的矩阵很容易处理。我已尝试使用numpy,但它显示以下错误消息:

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,带有新的点运算符@

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

  • 您使用圆括号而不是方括号-您必须为numpy的2d数组提供列表列表
    [[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
    
    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)
    

    你能提供一个矩阵向量乘法的?用法吗。
    *
    运算符通过执行元素相乘。
    ()
    创建一个序列,您应该在数组元素周围使用
    []
    。另外,如果您试图进行矩阵乘法,请使用
    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
    比Python
    for
    循环快。