首页 > 解决方案 > Cython 中的 2D NumPy 数组可以避免 Python 吗?

问题描述

我正在尝试在大型数据系列(>200MM 值)的 while 循环中最小化 Python 依赖性。

在 Cython 中比较或设置 1D NumPy 数组可以完全用 C 完成,但是用 2D NumPy 数组做同样的事情会演变成昂贵的 Python。

有谁知道如何避免这种情况?

最小代码示例:

#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: cdivision=True

import numpy as np
cimport numpy as np

def sometest():
    cdef np.ndarray[np.float64_t, ndim=1] arr1d = np.zeros((10))
    cdef np.ndarray[np.float64_t, ndim=2] arr2d = np.zeros((10))

    if arr1d[0] > 1:
        arr1d[0] = 1

    if arr2d[0][0] > 1:
        arr2d[0][0] = 1

Cython 注释:

Cython 注释

扩展的 Cython 注释:

扩展的 Cython 注释

提前感谢您的任何想法。

标签: pythonpython-3.xcython

解决方案


谢谢@hpaulj。

使用 arr2d[0,0] 而不是 arr2d[0][0] 访问确实不会降级为 Python。

更新代码:

#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: cdivision=True

import numpy as np
cimport numpy as np

def sometest():
    cdef np.ndarray[np.float64_t, ndim=1] arr1d = np.zeros((10))
    cdef np.ndarray[np.float64_t, ndim=2] arr2d = np.zeros((10, 10))

    if arr1d[0] > 1:
        arr1d[0] = 1

    if arr2d[0][0] > 1:
        arr2d[0][0] = 1

    if arr2d[0,0] > 1:
        arr2d[0,0] = 1

Cython 注释:

Cython 注释


推荐阅读