gpt4 book ai didi

numpy - Cython Memoryview 中的数组广播

转载 作者:行者123 更新时间:2023-12-04 08:08:07 24 4
gpt4 key购买 nike

我在 cython 中创建了一个类型化的内存 View ,并想将它乘以一个标量:

import numpy as np
import math
cimport numpy as np

def foo():
N = 10
cdef np.double_t [:, :] A = np.ones(shape=(N,N),dtype=np.double_)
cdef int i,j
cdef double pi = math.pi
for i in range(N):
for j in range(N):
A[i,j] *= pi
return A

def bar():
N = 10
cdef np.double_t [:, :] A = np.ones(shape=(N,N),dtype=np.double_)
cdef double pi = math.pi
A *= pi
return A
功能 foo()执行此任务但不是很方便/可读。
线路 A *= pi在函数中 bar()但是不编译: Invalid operand types for '*' (double_t[:, :]; double) .
有没有办法在 cython memoryview 上执行这样的广播操作?

最佳答案

不,内存 View 不会这样做。内存 View 实际上只是一种快速访问数组单个元素的方法。它没有可以在数组上执行的数学运算的真正概念。
如果您的 bar函数,任何输入它的尝试实际上可能会使它变得更糟(即它会花费额外的时间检查类型,但最终工作是在对 Numpy 函数的普通调用中完成的)。
有许多(不是 100% 令人满意的)从内存 View 中获取 Numpy 数组的方法:

  • np.asarray(memview) - 这应该在不复制的情况下完成(假设您没有使用深奥的间接内存布局)。可能值得添加一个断言来检查是否没有复制。
  • memview.base - 稍微小心一点。如果内存 View 是切片的结果,则 .base将是原始的未切片对象。
  • 保持一个并行的 numpy 数组和 memoryview 变量:
     Anp = np.array(...)
    cdef double[:] Amview = Anp
    因为 memoryview 是一些内存的 View ,对数组的修改将反射(reflect)在 memoryview 中,反之亦然。 (重新分配数组变量,例如 Anp = something_else ,不会被反射(reflect))。

  • 总之,内存 View 是为一项主要工作而设计的:能够快速访问单个元素。如果这不是您正在做的,那么您可能不想使用内存 View 。

    关于numpy - Cython Memoryview 中的数组广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66118199/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com