代码之家  ›  专栏  ›  技术社区  ›  michaelsnowden

NumPy从np添加输出。dot或np。乘法到现有数组

  •  4
  • michaelsnowden  · 技术社区  · 8 年前

    NumPy ,可以将参数指定为 np.dot np.multiply 打电话 out ,以便返回结果时不会创建新数组。然而,在我的用例中,我需要计算以下内容:

    1. c = c + np.dot(a, b) # where a and b are matrices of shape n x m, and m x p
    2. c = c + np.multiply(a, b) # where a and b are matrices of equal shape n x m

    1. np.dot(a, b, add_to=c)
    2. np.multiply(a, b, add_to=c)
    1 回复  |  直到 8 年前
        1
  •  4
  •   Divakar    8 年前

    scipy.linalg.blas 支持矩阵多应用程序,并将其累积到现有阵列中。

    所以,第一次 dot sgemm (single-precision)/dgemm (double-precision)

    from scipy.linalg.blas import dgemm, sgemm
    
    dgemm(alpha=1.0, a=a, b=b, c=c, beta=1.0)
    

    格式为 C = alpha*(a x b) + beta*C .

    *

    x :矩阵乘法

    样本运行-

    In [549]: a = np.random.randint(0,9,(3,4))
         ...: b = np.random.randint(0,9,(4,5))
         ...: c = np.random.randint(0,9,(3,5))
         ...: 
    
    In [550]: c
    Out[550]: 
    array([[2, 4, 7, 6, 1],
           [8, 7, 2, 1, 7],
           [4, 3, 5, 4, 4]])
    

    2) 制作输出阵列的副本以供以后测试:

    In [551]: c_copy1 = c.copy()
    

    3) 使用 np.dot

    In [552]: c = c + np.dot(a, b)
    
    In [553]: c
    Out[553]: 
    array([[88, 94, 75, 66, 93],
           [55, 51, 55, 38, 65],
           [61, 51, 25, 45, 68]])
    

    3) 使用 dgemm 复制时-

    In [554]: dgemm(alpha=1.0, a=a, b=b, c=c_copy1, beta=1.0)
    Out[554]: 
    array([[ 88.,  94.,  75.,  66.,  93.],
           [ 55.,  51.,  55.,  38.,  65.],
           [ 61.,  51.,  25.,  45.,  68.]])
    


    saxpy/daxpy 来自同一模块。这一点在本报告中已被其他很少的替代方案所涵盖 this other post .