Numpy二维数组传递到C扩展模块

starviolet 2010-05-22 12:14:27
在Python下,建立一个numpy二维数组, 比如 a = zero((3,5))
把a传递到C扩展模块里
在C扩展模块里面直接修改a内的数值..
扩展模块运行完毕后,Python需要重新用到修改过的a

请问怎么实现?
...全文
412 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
thy38 2010-05-25
  • 打赏
  • 举报
回复
LS把二维数组转成一维数组传维C函数,思路不错,赞一个!
notax 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thy38 的回复:]

LS把二维数组转成一维数组传维C函数,思路不错,赞一个!
[/Quote]

谢谢,抛砖引玉,大概用PyArrayObject 也行吧,
想看看其他的,再比较比较,学习学习
thy38 2010-05-24
  • 打赏
  • 举报
回复
返回值的话解包就可以了,别忘了指定返回类型。
thy38 2010-05-24
  • 打赏
  • 举报
回复
应该可以用SWIG,不过这个也用SWIG好像用牛刀了,我写了个包装函数,把numpy的二维数组打包成ctypes的标准数组形式,传送给C。
from ctypes import *
import numpy

def Convert1DToCArray(TYPE, ary):
arow = TYPE(*ary.tolist())
return arow

def Convert2DToCArray(ary):
ROW = c_int * len(ary[0])
rows = []
for i in range(len(ary)):
rows.append(Convert1DToCArray(ROW, ary[i]))
MATRIX = ROW * len(ary)
return MATRIX(*rows)

a=numpy.array([[1,2,2],[1,3,4]])
caa = Convert2DToCArray(a)

def ShowCArrayArray(caa):
for row in caa:
for col in row:
print col,
print

print caa
ShowCArrayArray(caa)
flamkuavos 2010-05-24
  • 打赏
  • 举报
回复
正在学习python,帮你顶了,lz100%的结贴率大家会的一定要帮帮他!
notax 2010-05-24
  • 打赏
  • 举报
回复



#! /bin/sh

cat > mystuff.c << _EOF

void show_matrix(int *matrix, int rows, int columns)
{
int i, j;
for (i=0; i<rows; i++) {
for (j=0; j<columns; j++) {
printf("matrix[%d][%d] = %d\n", i, j, matrix[i*rows + j]);
}
}
}

_EOF

gcc -shared -O2 mystuff.c -ldl -o mystuff.so


cat > test.py << _EOF

import ctypes
import numpy as np

lib = ctypes.cdll.LoadLibrary("./mystuff.so")

arr = np.zeros((3,5))
#arr = np.array([[1,2],[3,4]])
tmp = np.asarray(arr)
rows, cols = tmp.shape
dataptr = tmp.ctypes.data_as(ctypes.c_char_p)
lib.show_matrix(dataptr, rows, cols)

_EOF

python test.py



sh test.sh

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧