C中的Numpy数组

5
我刚开始学习C语言,正在尝试为我的Python编写后端。目前我有一个笨重的系统,需要从Python中编写大量的输入文件(至少10^6个浮点数),然后初始化C(还必须加载许多其他数据),运行C直到终止,接收其输出,然后只能重新使用新的输入数组重新初始化它。
我不确定从外观上来看是否在概念上可能,但我希望能够将C直接指向numpy数组的内存地址,并像使用C创建的数组一样使用它。目标是Python初始化C,构建其第一个数组,运行C代码,直到准备好下一个数组,然后由Python生成。
这是一些我编写的虚拟代码,用于尝试让C读取numpy数组。目前,C只会导致分段错误,我不确定是因为我不擅长C,它不喜欢读取numpy数组还是两者都有问题。
Front.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()

Back.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布尔型来协调进程的工作和等待?例如,当Python初始化numpy数组时,将该值设置为1,C语言则在while(sp_bool==1)循环中等待。然后当Python完成操作并将该值更改为0时,C语言开始执行,最后在完成操作时将该值再次更改为1。


我不太了解Python是否有这样的方法,但如果有的话,它将是一个进程内的解决方案,而不是像你现在所做的那样是一个进程外的解决方案。Python不能从“.so”文件中调用C代码吗? - Medinoc
顺便说一下,即使它能够工作,你也没有正确使用sscanf():它返回解析的值的数量,而不是值本身。 - Medinoc
你可以将Python嵌入到你的C应用程序中。 - Ramchandra Apte
如果您想从头开始编写C代码,并希望从Python中运行它们,最好的方法是编写一个Python C扩展模块。Numpy用户指南提供了有关此主题的良好介绍。 - Jaime
1个回答

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语言不熟悉,但这是另一种选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接