我包装了一个C文件,因此可以在python中使用它。C函数的输出是双精度数组。我希望这是python中的一个numpy数组。我有垃圾 这是生成错误的示例。
首先,是C文件(着重于最后一个函数定义,其他所有内容都应该可以):
#include <Python.h>
#include <numpy/arrayobject.h>
#include <stdio.h>
static char module_docstring[] =
"docstring";
static char error_docstring[] =
"generate the error";
static PyObject *_aux_error(PyObject *self, PyObject *args);
static PyMethodDef module_methods[] = {
{"error", _aux_error, METH_VARARGS, error_docstring},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC init_tmp(void) {
PyObject *m = Py_InitModule3("_tmp", module_methods, module_docstring);
if (m == NULL)
return;
/* Load `numpy` functionality. */
import_array();
}
static PyObject *_aux_error(PyObject *self ,PyObject *args) {
double vector[2] = {1.0 , 2.0};
npy_intp dims[1] = { 2 };
PyObject *ret = PyArray_SimpleNewFromData(1, dims, (int)NPY_FLOAT , vector );
return ret;
}
编译就可以了(据我了解-我使用了可编译所有内容的python脚本)。
在python中,我运行以下脚本来测试新模块:
try:
import _tmp
res = _tmp.error()
print(res)
except:
print("fail")
我在屏幕上看到的结果是垃圾。我尝试用替换(int)NPY_FLOAT
,(int)NPY_FLOAT32, (int)NPY_FLOAT64, (int)NPY_DOUBLE
但仍然会产生垃圾。我正在使用python2.7。
谢谢!!!
编辑 :按照下面的答案,我将最后一个功能更改为:
static PyObject *_aux_error(PyObject *self, PyObject *args) {
double *vector = calloc(2, sizeof(double));
vector[0] = 1.0;
vector[1] = 2.0;
npy_intp *dims = calloc(1 , sizeof(npy_intp));
dims[1] = 2;
PyObject *ret = PyArray_SimpleNewFromData(1, dims, (int)NPY_FLOAT , &vector );
return ret;
}
现在,python显示了一个空数组。
尝试更改此:
static PyObject *_aux_error(PyObject *self) {
对此:
static PyObject *_aux_error(PyObject *self, PyObject *args) {
args
即使您不使用它定义函数,Python也会传递该参数。
您的代码仍然存在一个基本问题。您已经使用vector
堆栈上的数组创建了一个numpy数组。当_aux_error
返回时,该内存将被回收并可重复使用。
您可以使用PyArray_SimpleNew()
分配numpy数组的方式创建数组,然后将其复制vector
到数组的数据中:
static PyObject *_aux_error(PyObject *self, PyObject *args)
{
double vector[2] = {1.0 , 2.0};
npy_intp dims[1] = {2};
PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
memcpy(PyArray_DATA(ret), vector, sizeof(vector));
return ret;
}
请注意,我将类型更改为NPY_DOUBLE
; NPY_FLOAT
是32位浮点类型。
在一条评论中,您询问了有关在中动态分配内存的问题_aux_error
。这是可能有用的示例的变体。数组的长度仍用硬编码dims
,因此它不是完全通用的,但可能足以解决注释中的问题。
static PyObject *_aux_error(PyObject *self, PyObject *args)
{
double *vector;
npy_intp dims[1] = {5};
npy_intp k;
PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
vector = (double *) PyArray_DATA(ret);
/*
* NOTE: Treating PyArray_DATA(ret) as if it were a contiguous one-dimensional C
* array is safe, because we just created it with PyArray_SimpleNew, so we know
* that it is, in fact, a one-dimensional contiguous array.
*/
for (k = 0; k < dims[0]; ++k) {
vector[k] = 1.0 + k;
}
return ret;
}
本文向大家介绍Python Numpy数组扩展repeat和tile使用实例解析,包括了Python Numpy数组扩展repeat和tile使用实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python Numpy数组扩展repeat和tile使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 numpy.repe
问题内容: 目前,我有一些这样的代码 我认为此代码 效率不高, 因为需要返回数组的副本而不是 就地修改ret 我想知道是否可以将numpy数组用于以下代码: 这样,效率会更高。有人对此有想法吗?谢谢! 问题答案: 想象一个numpy数组占据一个连续的内存块。现在想象一下其他对象,例如其他numpy数组,它们正占据着numpy数组左右两侧的内存。没有空间可以追加或扩展我们的numpy数组。numpy
问题内容: 我想将一个字符串添加到列表中: 但它打印。这是为什么? 问题答案: 该函数是就地函数,即它将对原始列表本身进行更改。来自文档 通过添加 给定 列表中的所有项目来扩展列表;等效于a [len(a):] =L。 因此,您无需将其重新分配回列表变量。 你可以做 然后当您打印时 更好的方法 如下所述使用是更好的方法。
问题内容: 我知道您不能动态扩展普通数组,但这是一种有效的方法吗? 我知道比尝试使用普通数组更好的方法,但是我想首先使用普通数组来解决这个问题。 我的愿望是,它从0 + 1(so 1)开始,在被称为new时,它的大小与相同,然后保持不变,同时再次声明,然后将其复制回新的大小。这对我来说很有意义,但我总是会遇到异常情况? 问题答案: 该方法不会更改OrigArray的值;它所做的只是在其中存储一个克
问题内容: 我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它: 所需结果: 实际结果: 可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。 问题答案: 永远不要在循环中追加数组:与基本的Python相比,这是NumPy非常不擅长的一项操作。这是因为您要对每个数据进行完整复制,这将花费您二次时间。 相反,只需将您的数组附加到Python列表中,并在最后进行转
问题内容: 由于Java 7默认情况下将使用新的G1垃圾收集,因此Java是否能够处理更大数量级的堆而不会“破坏” GC暂停时间?有人在生产中实际实施过G1,您的经验是什么? 公平地讲,我只有很长时间才发现GC暂停时间非常长,这远远超过了工作站。为了澄清我的问题;G1是否会打开通往数百GB堆的网关?结核病? 问题答案: 听起来G1的停顿时间更短,甚至可以指定最大停顿时间目标。 垃圾回收不仅仅是一个
我有一个数据库事务函数,可以进行多个查询,并以[resultQuery1、resultQuery2等格式返回每个查询的结果]。我不确定如何为这个泛型函数提供预期的返回类型。 游戏场 示例: 错误: 类型“(字符串|{id:number;})[]不可分配给类型“T”(字符串|{id:number;})[]”可分配给类型为“T”的约束,但“T”可以用约束“any[]”的不同子类型实例化。
问题内容: 有没有办法将Python元组扩展为函数-作为实际参数? 例如,这里做了魔术: 我知道可以将其定义,但是当然可能会有遗留代码。谢谢 问题答案: 不正是你要求什么。的*操作者只需解包元组(或任何可迭代),并把它们作为位置函数的自变量。有关更多信息,请参见此处。 侧问题:不要为你的标识符内建类型的名称,如使用,,,,等等-这是可怕的做法,它会回来,咬你的时候,你最不经意的时候,所以只是进入的