我习惯于在cython中使用BLAS例程(从scipy.linalg.cython_blas
),其中输入经常被就地修改(例如,在dger例程中)。
我正试图用scipy.linalg.blas.dger
做同样的事情,但是尽管使用了overwrite_a=True
,但a
并没有被触及
(dger
执行秩一更新,意思是a + np.outer(x, y)
)
In [29]: x = np.array([1, 0, 2])
In [30]: y = np.array([-1, 1, 0, 2])
In [31]: a = np.arange(12).reshape(3, 4)
In [32]: a + np.outer(x, y)
Out[32]:
array([[-1, 2, 2, 5],
[ 4, 5, 6, 7],
[ 6, 11, 10, 15]])
In [33]: dger(1.0, x, y, a=a, overwrite_a=True)
Out[33]:
array([[ -1., 2., 2., 5.],
[ 4., 5., 6., 7.],
[ 6., 11., 10., 15.]])
In [34]: a # still the original value
Out[34]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
那么overwrite_a=True
有什么用呢?我该如何在原地执行更新?你知道吗
编辑:我知道BLAS例程是用Fortran编写的,所以a
应该是按Fortran顺序的,但是即使更改它也不会改变a
。你知道吗
低级blas例程用f2py包装。你知道吗
参数
overwrites_X
是对f2py的提示(参见doc并搜索覆盖),即例程可以使用它认为合适的X
内存(它可能将空间用作暂存数组,而不是专门做其他例程中的out=
)。它还不如不用呢。你知道吗低级dger例程的文档中列出的参数没有太多细节。它们是根据函数的签名自动生成的,没有太多意义,希望用户知道相应的blas例程如何工作和f2py如何工作。你知道吗
signature for dger使用
intent(in,out,copy)
,这意味着原始参数未被触及(由于copy
),Fortran子例程中a
的返回值被转换为Python级函数的返回值。你知道吗所以,你在这里没什么办法解决你的问题。(错误,请参见编辑)
编辑:以上都是正确的,除了f2py将把输出放在a中,如果a的顺序(Fortran)和数据类型与预期的输出匹配,请参阅原始海报自我回复。你知道吗
很有趣:因为
a
需要Fortran排序,因为dger(Fortran例程)的输出是。你知道吗a.dtype
是np.int64
,因此dger不想将其类型更改为np.float64
,也不会覆盖它。你知道吗相关问题 更多 >
编程相关推荐