编写扩展函数操作数组-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

编写扩展函数操作数组

2020-04-17 18:11:08 940 2

你想编写一个C扩展函数来操作数组,可能是被array模块或类似Numpy库所创建。 不过,你想让你的函数更加通用,而不是针对某个特定的库所生成的数组。

取消 提交回答
全部回答(2)
  • 景凌凯
    2020-04-17 23:59:34

    在C扩展模块中操作隐形指针:可以参考这篇文章: https://www.baidu.com/link?url=6djl4oF9q-bjXsKIc7n5xA5eoO3YbD_ISURCaytWx9o0B2dmmEhXclgxb_R

    0 0
  • 哦哦喔
    2020-04-17 18:11:16
    为了能让接受和处理数组具有可移植性,你需要使用到 Buffer Protocol . 下面是一个手写的C扩展函数例子, 用来接受数组数据并调用本章开篇部分的 avg(double *buf, int len) 函数:
    
    /* Call double avg(double *, int) */
    static PyObject *py_avg(PyObject *self, PyObject *args) {
      PyObject *bufobj;
      Py_buffer view;
      double result;
      /* Get the passed Python object */
      if (!PyArg_ParseTuple(args, "O", &bufobj)) {
        return NULL;
      }
    
      /* Attempt to extract buffer information from it */
    
      if (PyObject_GetBuffer(bufobj, &view,
          PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) == -1) {
        return NULL;
      }
    
      if (view.ndim != 1) {
        PyErr_SetString(PyExc_TypeError, "Expected a 1-dimensional array");
        PyBuffer_Release(&view);
        return NULL;
      }
    
      /* Check the type of items in the array */
      if (strcmp(view.format,"d") != 0) {
        PyErr_SetString(PyExc_TypeError, "Expected an array of doubles");
        PyBuffer_Release(&view);
        return NULL;
      }
    
      /* Pass the raw buffer and size to the C function */
      result = avg(view.buf, view.shape[0]);
    
      /* Indicate we're done working with the buffer */
      PyBuffer_Release(&view);
      return Py_BuildValue("d", result);
    }
    下面我们演示下这个扩展函数是如何工作的:
    
    >>> import array
    >>> avg(array.array('d',[1,2,3]))
    2.0
    >>> import numpy
    >>> avg(numpy.array([1.0,2.0,3.0]))
    2.0
    >>> avg([1,2,3])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'list' does not support the buffer interface
    >>> avg(b'Hello')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Expected an array of doubles
    >>> a = numpy.array([[1.,2.,3.],[4.,5.,6.]])
    >>> avg(a[:,2])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: ndarray is not contiguous
    >>> sample.avg(a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Expected a 1-dimensional array
    >>> sample.avg(a[0])
    
    2.0
    >>>
    
    0 0
添加回答
相关问答

1

回答

怎么用c语言编程编写一个程序,输入4个数,求其平均值呢?

2022-03-29 20:01:55 271浏览量 回答数 1

1

回答

C语言如何将字符串转化成字符数组?

2022-03-29 17:48:40 196浏览量 回答数 1

1

回答

C语言如何输入二维字符串数组?

2022-03-29 21:55:50 297浏览量 回答数 1

1

回答

flask扩展重要的四种方式分别是什么?

2021-11-17 14:20:51 99浏览量 回答数 1

1

回答

flask扩展是什么?

2021-11-17 14:05:07 101浏览量 回答数 1

1

回答

将日期字符串转换为整数数组

2020-03-23 16:03:13 326浏览量 回答数 1

1

回答

如何在C中创建字符串数组?

2020-01-16 15:32:21 301浏览量 回答数 1

1

回答

编写程序在将字符串“wantyoutoknowonething”,统计出字母“n”和字母“o”的出现

2019-11-20 14:58:28 823浏览量 回答数 1

0

回答

扩展工具中的E-R图操作

2017-11-02 10:54:59 2170浏览量 回答数 0

4

回答

受影响5个小时,补偿3天?阿里云服务技术不好,算数也不好么?

2016-10-13 17:54:26 3255浏览量 回答数 4
+关注
0
文章
446
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载