C 中的 Numpy 数组

use*_*326 5 c python ctypes numpy backend

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

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

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

前端.py

array_interface 来自这里

#! /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()
Run Code Online (Sandbox Code Playgroud)

后退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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bi *_*ico 1

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

我认为让 C 代码在 Python 中可用的最简单方法是使用 Cython 包装它。这里有两个教程,希望能够帮助您朝着正确的方向前进。如何从 Cython 调用现有 C 代码以及如何在 Cython 中使用 NumPy 数组

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