繁体   English   中英

Cython:如何将“对象”类型的 numpy 二维数组转换为内存视图?

[英]Cython: How to convert numpy 2D array of type "object" to memoryview?

我想知道如何将“对象”类型的 2D numpy 数组输入转换为 Cython 内存视图?

例如,如果我有以下 Cython 扩展类型:

cdef class A:
   cdef:
       const double[:, ::1] X  # here I define that X is a memoryview

   cdef int init(self, object X):
        # how do I convert X into the correct memoryview object?
        self.X = X

在Python中初始化class A

def do_something():
    # say we have a 2D numpy array; this is an example, and not necessarily how it is constructed
    X = np.zeros((5, 2), dtype=np.float32)
    A()
    
    # When we initialize, I would like Cython to now store it as a Cython memoryview
    A.init(X)

我目前使用 Cython 代码面临两个问题:

  1. 我不知道X是否被初始化为连续的,或者fortran。
  2. 我想强制它进入一个连续的数组。

我该怎么做才能使用始终使用连续数组的 Cython 代码?

我想问的一个切线问题是,强制 Cython 内存视图与 fortran 相比是否有任何权衡取舍?

我该怎么做才能使用始终使用连续数组的 Cython 代码?

numpy.ascontiguousarray - 如果它已经正确,它什么都不做,如果不是,则复制一份。

我想问的一个切线问题是,强制 Cython 内存视图与 fortran 相比是否有任何权衡取舍?

为了最好地使用 CPU 缓存,您通常希望最内层的循环位于连续的维度上。 因此,您喜欢哪一种取决于您在做什么。 例如,对于matrix vector矩阵乘法,您可能希望第二个维度是连续的。 对于vector matrix乘法,您可能希望第一个维度是连续的。

如果您将它们传递给第三方库,您可能希望符合他们的期望。


也许如果你从各种来源接受 arrays 正确的 memoryview 是double[:,:] (即不要求它是连续的)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM