将广播转变为可计算的东西。矩阵 np.multipy

transform broadcasting to something calculateable. matrix np.multipy

我正在尝试计算这种类型的计算:

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 这是有道理的,但我的问题是:

我能否在不被迫使用完全减慢进程的循环的情况下解决这个问题??

我的问题主要是关于性能和需要长时间 运行 任务超过 30 秒的解决方案不是一个选项。

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

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