尽管使用overwrite_a = True

时间:2017-10-06 15:09:41

标签: python numpy scipy cython blas

我习惯在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

2 个答案:

答案 0 :(得分:2)

非常有趣:它是因为

  • a需要Fortran命令,因为Fortger例程dger的输出是。
  • a.dtypenp.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匹配预期输出,请参阅原始海报自我回复。

相关问题