Python 当使用scipy.linalg.blas.sgemm时,numpy dot为大型阵列返回无效值

Python 当使用scipy.linalg.blas.sgemm时,numpy dot为大型阵列返回无效值,python,numpy,scipy,blas,Python,Numpy,Scipy,Blas,我正在尝试计算A•AT: #这些是我的虚拟测试值 A=np.ones((15000265),dtype=np.float32,order='F') A_T=np.one((265150000),dtype=np.float32,order='F') out=scipy.linalg.blas.sgemm(alpha=1.0,a=a,b=a\u T) 两分钟后: In[7]:out 出[7]: 数组([[265,265,265.,…,0,0,0.], [ 265., 265., 265.,

我正在尝试计算A•AT:

#这些是我的虚拟测试值
A=np.ones((15000265),dtype=np.float32,order='F')
A_T=np.one((265150000),dtype=np.float32,order='F')
out=scipy.linalg.blas.sgemm(alpha=1.0,a=a,b=a\u T)
两分钟后:

In[7]:out
出[7]:
数组([[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[10]:(150000,150000)
注意到零了吗?我迷路了。。。我尝试过使用64位浮点,得到了相同的输出。 从35468开始,数组为零

In[39]:out[035468]
Out[39]:0.0
在[9]中:scipy.\u版本__
输出[9]:“0.12.1”
更新/编辑:

我相当肯定,np.dot正在调用*gemm方法本身

[1]中的
:A=np.ones((15000265),dtype=np.float32,order='F')
在[2]中:A_T=np.one((265150000),dtype=np.float32,order='F')
In[3]:out=A.dot(A\u T)
In[4]:变形
Out[4]:(150000,150000)
In[5]:out
出[5]:
数组([[265,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,0.],dtype=float32)

在我的机器上,您的示例因
内存错误而消失,与
np.dot(A,A.T)
相同

减小矩阵大小时,会产生正确的结果

要进一步调试它,请尝试直接使用Fortran BLAS调用,而不使用python。如果它过去了,考虑一下。
作为旁注,从scipy 0.13开始,您可以使用“警告:这些函数很少或没有错误检查。错误使用它们可能会导致崩溃,因此更喜欢使用scipy.linalg中的更高级别例程”。因为
np.dot
可以进行矩阵乘法,为什么您选择使用
scipy.linalg.blas.dgemm
?对我来说,
np.dot(A,A_T)
更准确、更快。由于您的示例数据破坏了我的计算机,我不得不减小大小:我非常确定taht np.dot正在调用这些确切的blas例程。我对np.dot也有同样的失败。我现在重新运行以确认,并将更新原始帖子。@John1024谢谢您询问John。我最初从sgemm b/c开始,我想通过不必创建A和A_T来节省内存,因为*gemm有'trans_A'和'trans_b'参数。现在,我不认为这有什么关系,因为两个float32数组没有占用那么多空间。我同意……我需要从fortran运行blas或直接尝试cblas。在“hello world”之前,我从来没有编译过fortran……我想我开始学习:)注意这方面的新线程:)好吧,这里你需要的只是一个hello world:-)