将广播转变为可计算的东西。矩阵 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
我正在尝试计算这种类型的计算:
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