python - 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 注释:
提前感谢您的任何想法。
解决方案
谢谢@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 注释:
推荐阅读
- r - 使用特定标准消除 R 中的重复项
- amazon-web-services - 从 ECS Fargate 容器发送 /var/log (syslog) 到 Cloudwatch
- python - 尝试将 txt 文件读取为 csv 但遇到问题
- flutter - 异步调用以从路由参数中获取一些数据
- flask - Flask-Socketio:WebSocket 握手期间出错:意外的响应代码:503 & WebSocket 在建立连接之前关闭
- javascript - 使用 React 访问 API 时出现未经授权的错误
- vue.js - 渲染时设置 vue-swatches 子组件的颜色
- airflow - 有没有办法通过 SimpleHttpOperator 在 Airflow 中通过 REST 上传文件?
- vue.js - Vue路由器,无法读取未定义的属性“推送”
- javascript - 函数返回自身,意外行为