我习惯在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
。
答案 0 :(得分:2)
非常有趣:它是因为
a
需要Fortran命令,因为Fortger例程dger的输出是。a.dtype
为np.int64
,因此dger不希望将其类型更改为np.float64
,也不会覆盖它。答案 1 :(得分:0)
低级别的blas例程包含f2py。
参数overwrites_X
是f2py的提示(请参阅doc并搜索覆盖),例程可能使用X
的内存。 fit(它可能将空格用作临时数组,而不是专门执行out=
在其他例程中执行的操作)。它也可能不会使用它。
低级dger例程的文档列出了没有太多细节的参数。它们是从函数的签名中自动生成的,并没有更多的含义,用户应该知道相应的blas例程如何工作和 f2py如何工作。
signature for dger使用intent(in,out,copy)
意味着原始参数不受影响(由于copy
),并且Fortran子例程中a
的返回值变为返回Python级函数的值。
所以,你可以在这里做很多事情来解决你的问题。 (错误,请参阅编辑)
编辑:以上所有都是正确的,除非f2py将输出放在a中,如果排序(Fortran)和dtype匹配预期输出,请参阅原始海报自我回复。