scipy 尽管使用 overwrite_a=True,BLAS 例程不会覆盖输入

scipy BLAS routine does not overwrite input despite using overwrite_a=True

我习惯在 cython(来自 scipy.linalg.cython_blas)中使用 BLAS 例程,其中输入经常被修改(例如,在 dger 例程中)。 我正在尝试对 scipy.linalg.blas.dger 执行相同的操作,但尽管使用 overwrite_a=Truea 仍未受影响

(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

很有意思:因为

  • a 需要进行 Fortran 排序,因为 dger(一个 Fortran 例程)的输出是。
  • a.dtypenp.int64,所以dger不想把它的类型改成np.float64,也不覆盖它。

低级 blas 例程用 f2py 包装。

参数 overwrites_X 是对 f2py 的提示(参见 doc 并搜索覆盖)例程 可能 使用 [=11 的内存=] 因为它认为合适(它可能使用 space 作为临时数组,而不是专门做 out= 在其他例程中所做的事情)。还不如不用呢

低级 dger 例程的文档列出了参数但没有太多细节。它们是根据函数的签名自动生成的,并没有太多意义,希望用户了解相应的 blas 例程如何工作 f2py 的工作方式

signature for dger 使用 intent(in,out,copy) 意味着原始参数未被修改(由于 copy)并且 a 的 return 值来自Fortran子程序做成Python级函数的return值。

因此,您在这里无法解决您的问题。 (错误,请参阅编辑)

编辑:如果 a 的顺序 (Fortran) 和 dtype 与预期输出相匹配,f2py 将把输出放在 a 中,除此之外,以上所有内容都是正确的,请参阅原始发布者的自我回复。