如何将for-loop推向numpy

use*_*tar 6 python numpy kriging

我有以下代码正是我想要的(它是kriging方法的一部分).但问题是它太慢了,我想知道是否有任何选择将for-loop推向numpy?如果我推出numpy.sum,并在那里使用轴参数,它会加速一点点,但显然这不是瓶颈.关于我如何能够将forloop推向numpy以加快速度,还是以其他方式加速它的任何想法?)

# n = 2116
print GRZVV.shape  # (16309, 2116)
print GinvVV.shape  # (2117, 2117) 
VVg = numpy.empty((GRZVV.shape[0]))

for k in xrange(GRZVV.shape[0]):
    GRVV = numpy.empty((n+1, 1))
    GRVV[n, 0] = 1
    GRVV[:n, 0] = GRZVV[k, :]
    EVV = numpy.array(GinvVV * GRVV)  # GinvVV is numpy.matrix
    VVg[k] = numpy.sum(EVV[:n, 0] * VV)
Run Code Online (Sandbox Code Playgroud)

我发布了ndarrays n矩阵的维度来清除一些东西

编辑:VV的形状是2116

Joe*_*oom 5

您可以执行以下操作代替循环k(运行时~3s):

tmp = np.concatenate((GRZVV, np.ones((16309,1),dtype=np.double)), axis=1)
EVV1 = np.dot(GinvVV, tmp.T)
#Changed line below based on *askewchan's* recommendation
VVg1 = np.sum(np.multiply(EVV1[:n,:],VV[:,np.newaxis]), axis=0)
Run Code Online (Sandbox Code Playgroud)

  • +1对于大型阵列来说,比"np.einsum"快得多,不确定我理解为什么...... (2认同)