运行得比较慢的行方向的点积给出一个矩阵甲具有形状(N,K)和向量大小Ñ的小号,我要计算矩阵ģ具有形状(K,K)如下:numpy的“向量化” for循环
G + = S [I] * A [I] .T * A [I],对于所有我在{ 0,...,n-1}
我试图实现,使用一个for循环(方法1),并在矢量方式(方法2),但对于循环实现更快ķ(特别是当k的较大值> 500)。
该代码被写为如下:
import numpy as np
k = 200
n = 50000
A = np.random.randint(0, 1000, (n,k)) # generates random data for the matrix A (n,k)
G1 = np.zeros((k,k)) # initialize G1 as a (k,k) matrix
s = np.random.randint(0, 1000, n) * 1.0 # initialize a random vector of size n
# METHOD 1
for i in xrange(n):
G1 += s[i] * np.dot(np.array([A[i]]).T, np.array([A[i]]))
# METHOD 2
G2 = np.dot(A[:,np.newaxis].T, s[:,np.newaxis]*A)
G2 = np.squeeze(G2) # reduces dimension from (k,1,k) to (k,k)
的矩阵G1和G2是相同的(它们是基质ģ),并且唯一的差别是它们是如何计算的。有没有更聪明有效的方法来计算?
最后,这些都是我随机尺寸得到了ķ和ñ时代:
Test #: 1
k,n: (866, 45761)
Method1: 337.457569838s
Method2: 386.290487051s
--------------------
Test #: 2
k,n: (690, 48011)
Method1: 152.999140978s
Method2: 226.080267191s
--------------------
Test #: 3
k,n: (390, 5317)
Method1: 5.28722500801s
Method2: 4.86999702454s
--------------------
Test #: 4
k,n: (222, 5009)
Method1: 1.73456382751s
Method2: 0.929286956787s
--------------------
Test #: 5
k,n: (915, 16561)
Method1: 101.782826185s
Method2: 159.167108059s
--------------------
Test #: 6
k,n: (130, 11283)
Method1: 1.53138184547s
Method2: 0.64450097084s
--------------------
Test #: 7
k,n: (57, 37863)
Method1: 1.44776391983s
Method2: 0.494270086288s
--------------------
Test #: 8
k,n: (110, 34599)
Method1: 3.51851701736s
Method2: 1.61688089371s