【问题标题】:Python translating C saxpy [closed]Python翻译C saxpy [关闭]
【发布时间】:2016-10-27 05:07:15
【问题描述】:

这是 C 代码:

btemp = (*beta)/(*beta_prev);
for (k=0; k<xsize*ysize; k++) {
  parray[k] = zarray[k] + btemp*parray[k];
}

我正在 Python 中执行以下操作:

def saxpy(a, x, y):
    return np.array([a * xi + yi for xi, yi in zip(x, y)], np.float32)
#...
btemp = beta / beta_prev
ptemp = saxpy(btemp, parray, zarray)
parray[:] = ptemp

在我的代码中,它似乎工作正常(zarrayparray 不断变化,因为它们在 while 循环中)。

但我会这样做:

btemp = beta / beta_prev
parray = saxpy(btemp, parray, zarray)

我的代码在循环中迭代了几次后失败,它们不一样吗?

【问题讨论】:

  • 你能说明这些都是如何在 for 循环中绑定的吗?
  • 您使用的是 Python 2 还是 Python 3? betabeta_prev 的类型是什么?
  • 既然c使用的是指针,那么如何初始化和修改呢?
  • 代码比较复杂,不知道贴出来好不好。我正在使用 Python 2,并且 beta y beta_prev 是浮动的。
  • zarrayparray 是大小为 xsize*ysize 的一维数组。

标签: python c algorithm numpy


【解决方案1】:

您将 parray[:] = 更改为只是 parray =,这并不等同。前者按元素分配parray 的内容,如果parray 与分配右侧的类型不同,这是一个重要的区别。

考虑两种情况:

>>> xs = [1, 2, 3, 4]
>>> xs[:] = tuple(2 * x for x in xs)
>>> xs
[2, 4, 6, 8]
>>> type(xs)
<class 'list'>

>>> xs = [1, 2, 3, 4]
>>> xs = tuple(2 * x for x in xs)
>>> xs
(2, 4, 6, 8)
>>> type(xs)
<class 'tuple'>

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2014-01-15
    • 2012-09-24
    • 2011-02-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多