三行代码  ›  专栏  ›  技术社区  ›  adir abargil

将广播转换为可计算的内容。矩阵np.multipy

  •  0
  • adir abargil  · 技术社区  · 1 月前

    arr = np.arange(4) 
    # array([0, 1, 2, 3])
    
    arr_t =arr.reshape((-1,1))
    # array([[0],
    #        [1],
    #        [2],
    #        [3]])
    
    mult_arr = np.multiply(arr,arr_t) # <<< the multiplication
    # array([[0, 0, 0, 0],
    #        [0, 1, 2, 3],
    #        [0, 2, 4, 6],
    #        [0, 3, 6, 9]])
    

    最终在一行较大的矩阵索引中执行,并对通过计算复制的所有矩阵求和:

    arr = np.random.random((600,150))
    
    arr_t =arr.reshape((-1,arr.shape[1],1))
    
    
    mult = np.multiply(arr[:,None],arr_t)
    summed = np.sum(mult,axis=0)
    summed
    

    arr = np.random.random((6000,1500))
    

    我得到以下错误- MemoryError: Unable to allocate 101. GiB for an array with shape (6000, 1500, 1500) and data type float64 这是有道理的,但我的问题是:

    我是否可以在不被迫使用循环的情况下绕过这个问题,从而完全降低流程的速度??

    1 回复  |  直到 1 月前
        1
  •  1
  •   mozway    1 月前

    看起来您只是在尝试执行点积:

    arr.T@arr
    

    arr.T.dot(arr)
    
    检查这是你想要的
    arr = np.random.random((600,150))
    
    arr_t =arr.reshape((-1,arr.shape[1],1))
    mult = np.multiply(arr[:,None],arr_t)
    summed = np.sum(mult,axis=0)
    
    np.allclose((arr.T@arr), summed)
    # True