python - C 中的 Numpy 数组

标签 python c numpy ctypes backend

我才刚刚开始使用 C,正在尝试为我的 python 做一个后端。目前我有一个繁琐的系统,它从 python 写入巨大的输入文件(至少 10^6 float )然后初始化 C(它还必须加载很多其他数据)运行 C 直到终止,接收它的输出只需使用新的输入数组重新初始化它即可。

我不确定环顾四周在概念上是否可行,但我希望能够将 C 指向一个 numpy 数组的内存地址,并像使用 C 生成的数组一样使用它。目的是让 python 初始化 C,构建它的第一个数组,运行 C 代码,直到它为下一个数组做好准备,然后由 python 生成。

这是我编写的一些虚拟代码,用于尝试让 C 读取 numpy 数组。目前 C 只是有一个段错误,我不确定是不是因为我不擅长 C,它不喜欢读取 numpy 数组或两者兼而有之。

前台.py

array_interface 来自 here .

#! /usr/bin/python

import numpy as np
import subprocess as sp

ray = np.array([x*3.14 for x in range(10)])
addr = ray.__array_interface__['data'][0]

pro = sp.Popen(['./back', hex(addr)])
print pro.communicate()[0]
print ray[:5]
quit()

返回.c

#include <stdio.h>
#include <stdlib.h>

int main(char *argv[])
{
  float *addr;
  int n;
  float a[10];

  // Hopefully making a pointer to the first float in the np.ndarray
  addr = sscanf(argv[1], "%x");

  n = 0;
  while( n<10 )
  {
  // Hopefully stepping through the np.ndarray one float at a time.
    a[n] = *addr;
    addr++;
    n++;
  }
  // Return the first five values to compare with python.
  fprintf(stdout, '%f %f %f %f %f\n', a[0], a[1], a[2], a[3], a[4]);
  return 0;
}

是否可以让 C 像这样读取 numpy 数组,或者这种方法是否存在根本性缺陷?有更好的方法吗?如果这确实有效,是否可以使用 Ctype bool,两个进程都知道其地址,以协调哪个进程正在工作,哪个正在等待?例如python 在初始化 numpy 数组时将值设置为 1 - C 正在等待卡在 while(sp_bool==1) 循环中。然后当 python 完成时,它会将值更改为 0 并执行 C,最后在完成时将值更改回 1。

最佳答案

听起来您最好的选择可能是从 python 调用 C 代码。这不仅很有可能,而且实际上 NumPy 就是这样编写的。 NumPy 主要是用 C 编写的,所以当你执行 np.add(array1, array2) 时,Python 将 array1array2 传递给 NumPy 的 C 代码, C 代码为结果创建一个输出数组,添加输入数组的元素将结果放入输出数组,并返回输出数组。

我认为让您的 C 代码在 Python 中可用的最简单方法是使用 Cython 对其进行包装。这里有两个教程,希望能让您朝着正确的方向前进。 How to call existing C code from Cythonhow to use NumPy arrays in Cython .

我还应该提到,您可以使用 NumPy C API 从 C 代码访问 NumPy 数组,这对你来说可能比使用 Cython 更难,因为你是 C 的新手,但如果你选择那条路线,这是另一种方式。

关于python - C 中的 Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269292/

相关文章:

python - 在给定轴索引处替换 nd numpy 数组中的值

python - Google Scrape with Python 中的结果数量错误

python - 如何使用 python 将 .txt 文件转换为 xml 文件?

python - 是否可以在不编写生成器函数的情况下从链表生成可迭代对象?

python - 在 pandas 中映射数据框中的组名称

c - bss 中的 28 个额外字节

linux - 即使 vm.overcommit_memory=1 ,numpy 也不会过度使用内存

c - 什么会导致 malloc 初始化内存?

c - 将宏标记为已弃用的最佳方法是什么?

python - 如何hstack numpy记录数组?