[英]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 代码面临两个问题:
X
是否被初始化为连续的,或者fortran。我该怎么做才能使用始终使用连续数组的 Cython 代码?
我想问的一个切线问题是,强制 Cython 内存视图与 fortran 相比是否有任何权衡取舍?
我该怎么做才能使用始终使用连续数组的 Cython 代码?
numpy.ascontiguousarray
- 如果它已经正确,它什么都不做,如果不是,则复制一份。
我想问的一个切线问题是,强制 Cython 内存视图与 fortran 相比是否有任何权衡取舍?
为了最好地使用 CPU 缓存,您通常希望最内层的循环位于连续的维度上。 因此,您喜欢哪一种取决于您在做什么。 例如,对于matrix vector
矩阵乘法,您可能希望第二个维度是连续的。 对于vector matrix
乘法,您可能希望第一个维度是连续的。
如果您将它们传递给第三方库,您可能希望符合他们的期望。
也许如果你从各种来源接受 arrays 正确的 memoryview 是double[:,:]
(即不要求它是连续的)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.