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=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
。
很有意思:因为
a
需要进行 Fortran 排序,因为 dger(一个 Fortran 例程)的输出是。
a.dtype
是np.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 中,除此之外,以上所有内容都是正确的,请参阅原始发布者的自我回复。
我习惯在 cython(来自 scipy.linalg.cython_blas
)中使用 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
。
很有意思:因为
a
需要进行 Fortran 排序,因为 dger(一个 Fortran 例程)的输出是。a.dtype
是np.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 中,除此之外,以上所有内容都是正确的,请参阅原始发布者的自我回复。