我正在尝试计算 A • AT:
两分钟后:
# These are my dummy values for testing
A = np.ones((150000,265),dtype=np.float32, order='F')
A_T = np.ones((265, 150000),dtype=np.float32, order='F')
out = scipy.linalg.blas.sgemm(alpha=1.0, a=A, b=A_T)
两分钟后:
In [7]: out
Out[7]:
array([[ 265., 265., 265., ..., 0., 0., 0.],
[ 265., 265., 265., ..., 0., 0., 0.],
[ 265., 265., 265., ..., 0., 0., 0.],
...,
[ 265., 265., 265., ..., 0., 0., 0.],
[ 265., 265., 265., ..., 0., 0., 0.],
[ 265., 265., 265., ..., 0., 0., 0.]])
In [10]: out.shape
Out[10]: (150000, 150000)
注意到了这些零吗?我迷失了...我尝试使用64位浮点数,但输出结果相同。从35468开始,数组中就全是零。
In [39]: out[0,35468]
Out[39]: 0.0
In [9]: scipy.__version__
Out[9]: '0.12.1'
更新/编辑:
我相当确定,np.dot是在调用*gemm方法本身。
In [1]: A = np.ones((150000,265), dtype=np.float32, order='F')
In [2]: A_T = np.ones((265, 150000),dtype=np.float32, order='F')
In [3]: out = A.dot(A_T)
In [4]: out.shape
Out[4]: (150000, 150000)
In [5]: out
Out[5]:
array([[ 265., 265., 265., ..., 265., 265., 265.],
[ 265., 265., 265., ..., 265., 265., 265.],
[ 265., 265., 265., ..., 265., 265., 265.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32)
np.dot
可以进行矩阵乘法,为什么选择使用scipy.linalg.blas.dgemm
? - John1024np.dot(A, A_T)
更加准确和更快。由于你的示例数据摧毁了我的计算机,我不得不缩小数据规模 :P - askewchan