scipyblas例程不覆盖输入,尽管使用overwrite_a=Tru

2024-04-24 00:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我习惯于在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。你知道吗


Tags: intruenpscipyoutarray例程cython
2条回答

低级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.dtypenp.int64,因此dger不想将其类型更改为np.float64,也不会覆盖它。你知道吗

相关问题 更多 >