如果这个问题不完整或难以理解,我很抱歉,我正在努力自己解决! 我在 python 中有以下 C 代码-我不太擅长的两种语言。
我认为以下 C 代码复制了 numpy 数组。当我使用它时它不起作用,它使用 SWITCH 语句并打印“默认”答案。有人可以帮忙吗?
是不是python的版本?它似乎适用于旧版本的 python。
static PyObject *llpy_acopy(PyObject *unused, PyObject *args)
{
PyObject *afrom = PyTuple_GET_ITEM(args, 0);
PyObject *ato = PyTuple_GET_ITEM(args, 1);
PyArrayObject *tmp = (PyArrayObject *)afrom;
int nd = tmp->nd;
int n = 1;
int i;
for (i=0; i<nd; i++)
n *= tmp->dimensions[i];
switch(tmp->descr->type_num) {
case PyArray_FLOAT:
memcpy(((PyArrayObject *)ato)->data, tmp->data,
(size_t)(n * sizeof(float)));
break;
case PyArray_INT:
memcpy(IDATA(ato), IDATA(afrom),
(size_t )(n * sizeof(int)));
break;
case PyArray_CHAR:
memcpy(CDATA(ato), CDATA(afrom),
(size_t )(n * sizeof(char)));
break;
default:
PyErr_SetString(PyExc_TypeError, "Cannot copy array now");
return NULL;
}
Py_INCREF(Py_None);
return Py_None;
}
从一个数组复制到另一个数组是 - 即第一个数组复制到第二个数组,替换现有值。
[[ 1. 0. 0. ]
[ 1.51999998 1.42799997 0. ]
[ 0.73699999 2.37800002 0. ]
...,
[-7.55183792 -9.31523228 -0.19252452]
[-6.7193203 -8.40346909 0.58392692]
[-8.47850037 -9.02481842 -0.46105781]]
[[ 1. 0. 0. ]
[ 1.51999998 1.42799997 0. ]
[ 0.73699999 2.37800002 0. ]
...,
[-5.86299992 -9.36299992 -5.0999999 ]
[-5.61800003 -7.94799995 -4.84499979]
[-6.12400007 -9.65600014 -6.02799988]]
最佳答案
表达式 tmp->descr->type_num
将返回一个整数(例如, double 结果为 type_num=12)。但我不知道 PyArray_INT
、PyArray_FLOAT
、PyArray_CHAR
等。从 Google 搜索来看,这些看起来像是在旧的 numeric_numarray 中定义的类型.h 标题。我认为您想要做的是使用 data-type checking listed here .请参见 PyTypeNum_ISFLOAT(num)
、PyTypeNum_ISINTEGER(num)
等
关于python - python 中的 C 代码和在 C 代码中复制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204098/