【问题标题】:C code within python and copying arrays in C codepython中的C代码和C代码中的复制数组
【发布时间】:2013-10-06 00:26:26
【问题描述】:

如果这个问题不完整或难以理解,我很抱歉,我正在尝试自己解决! 我有以下 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" 返回什么值?
  • 这整件事没有多大意义,并且过度简化了一般的 numpy 数组。您应该使用内置的 numpy C-api,它具有 PyArray_CopyInto 等可用功能。
  • 至于为什么会进入错误路径。我最好的猜测是你可能会被不同的整数类型或双精度数字击中?

标签: python c arrays numpy python-c-api


【解决方案1】:

表达式tmp-&gt;descr-&gt;type_num 将返回一个整数(例如,双精度导致type_num=12)。但我不知道PyArray_INTPyArray_FLOATPyArray_CHAR 等。从谷歌搜索来看,这些看起来像是在旧的 numeric_numarray.h 标头中定义的类型。我认为您想要做的是使用data-type checking listed here。见PyTypeNum_ISFLOAT(num)PyTypeNum_ISINTEGER(num)等。

【讨论】:

  • 你说得对,乔尔,非常感谢。问题是我收到的包是由几个人在很长一段时间内构建的,他们有混合的 numpy 和 Numeric 定义。我从使用数值数组类型切换到 Numpy 数组,问题似乎已经解决了。您可以在stackoverflow.com/questions/19236121/…中看到更多信息
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多