Python scipy中具有大F阶矩阵的dgemm断层作用

Python scipy中具有大F阶矩阵的dgemm断层作用,python,numpy,matrix,scipy,blas,Python,Numpy,Matrix,Scipy,Blas,我试图使用SciPy的dgemm在Python中计算A*A.T,但是当A的行维度很大(~50000)并且我按F顺序传递矩阵时,会得到一个segfault。当然,生成的矩阵非常大,但sgemm和传递给dgemm都是C阶工作 >>> import numpy as np >>> import scipy.linalg.blas >>> A = np.ones((50000,100)) #sgemm works, A.T is in F-order

我试图使用SciPy的dgemm在Python中计算A*A.T,但是当A的行维度很大(~50000)并且我按F顺序传递矩阵时,会得到一个segfault。当然,生成的矩阵非常大,但sgemm和传递给dgemm都是C阶工作

>>> import numpy as np
>>> import scipy.linalg.blas
>>> A = np.ones((50000,100))
#sgemm works, A.T is in F-order
>>> C = scipy.linalg.blas.sgemm(alpha=1.0, a=A.T, b=A.T, trans_a=True);
#dgemm works, A is in C-order (slower)
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A, b=A, trans_b=True); 
#dgemm segfaults when both are in F order
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A.T, b=A.T, trans_a=True);
Segmentation fault (core dumped)
以前有没有人经历过这个错误,或者知道是什么导致了它?我使用的是Python 2.7.3、numpy 1.8.0和scipy 0.13.2

编辑:FWIW,这是唯一产生错误的顺序

>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A.T, b=A, trans_a=True, trans_b=True)
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A, b=A.T)
以上两种方法都成功了

编辑:BLAS信息

blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include/atlas']

调用Fortran时不允许使用别名参数。我不确定这是否是你的问题,但可能是

前两个BLAS调用不别名参数,因为临时数组是在调用fortran之前生成的。也就是说,分别是由于数据类型不匹配和C顺序


第三个BLAS调用将参数化名。请改用b=A.copy().T。

您正在使用哪个blas库<代码>np.\uuuuu配置\uuuuu.blas\u信息。编辑说明以包含信息