我正在尝试执行2D乘1D矩阵乘法。具体做法是:
import numpy as np
s = np.ones(268)
one_d = np.ones(9422700)
s_newaxis = s[:, np.newaxis]
goal = s_newaxis * one_d
虽然上面的尺寸与我的问题((268, 1)
和(9422700,)
)相同,但我的数组中的实际值是非常大和非常小的数字的混合。因此,我可以运行goal = s_newaxis * one_d
,因为只有1个存在。但是,我使用我的实际数据耗尽ram 。
我认识到,在一天结束时,这相当于一个价值约25亿的矩阵,因此预计会有大量的内存占用。但是,效率方面的任何改进都是受欢迎的。
为了完整起见,我已经包含粗略尝试。它不是很优雅,但它只是一个改进,它不会让我的计算机崩溃(不可否认的是低吧)。
import gc
def arange(start, stop, step):
# `arange` which includes the endpoint (`stop`).
arr = np.arange(start=start, stop=stop, step=step)
if arr[-1] < stop:
return np.append(arr, [stop])
else:
return arr
left, all_arrays = 0, list()
for right in arange(0, stop=s_newaxis.shape[0], step=10):
chunk = s_newaxis[left:right,:] * one_d
all_arrays.append(chunk)
left = right
gc.collect() # unclear if this makes any difference...I suspect not.
goal = np.vstack(all_arrays)