我想我有一个大数据(N = 1e6和维度= 3)的情况.我需要在我的代码中多次执行一些矩阵操作,例如einsum,矩阵反转等.提出一个想法,我想做下面的事情.
import numpy.random as rd
ndata, kdata = 1e6, 1e5
x = rd.normal(0,1,(ndata, kdata,3,3))
y = rd.normal(0,1,(ndata, kdata,3,3))
Run Code Online (Sandbox Code Playgroud)
对于小ndata,kdata以下将是高效和方便的方法,
xy = einsum('pqrs, pqsu -> pqru', x, y )
Run Code Online (Sandbox Code Playgroud)
由于我有大的ndata和kdata以上方法成为内存绑定问题所以下一个赌注将是嵌套for循环ndata和kdata的点积,如下所示:
xyloop1 = np.empty((ndata, kdata, 3, 3))
for j in xrange(ndata):
for k in xrange(kdata):
xyloop1[j,k] = np.dot(x[j,k], y[j,k] )
Run Code Online (Sandbox Code Playgroud)
鉴于我所教授的循环在python中是令人讨厌的.此外,我想使用numpy的好处,所以思想块矩阵方法将是更好的事情如下:
nstep = 200
ndiv = ndata/nstep
kstep = 200
kdiv = kdata/kstep
xyloop2 = np.empty((ndata, kdata, 3, 3))
for j in xrange(ndiv):
ji, jf = j*nstep, (j+1)*nstep
for …
Run Code Online (Sandbox Code Playgroud)