为什么我的PyArrayObject *数据被截断了?

时间:2016-08-18 14:32:06

标签: python c numpy

为什么我在C函数中得到截断数组?

在C:

#include <Python.h>
#include <arrayobject.h>

PyObject *edge(PyObject *self, PyObject *args) {
    int *ptr;
    unsigned char *charPtr;
    PyArrayObject *arr;
    PyObject *back;
    int ctr = 0;
    int size = 500 * 500;

    if (!PyArg_ParseTuple(args, "O", &arr))
        return NULL;

    charPtr = (char*)arr->data;
    printf("\n strlen of charPtr is ---> %d \n", strlen(arr->data)); // --->> 25313 
    printf("\n strlen of charPtr is ---> %d \n", strlen(charPtr));  //--->> also 25313 

    back = Py_BuildValue("s", "Nice");
    return back;
}

在Python中:

import ImageProc
import cv2
import numpy
import matplotlib.pyplot as plt

img = cv2.imread("C:/Users/srlatch/Documents/Visual Studio 2015/Projects/PythonImage/andrew.jpg", cv2.IMREAD_GRAYSCALE)
np =  cv2.resize(img, (500,500))

for i in np:
  for k in i:
      count += 1

print("Size before passing to edge " + str(count) ) // --->>  250000 

result = ImageProc.edge(np)
cv2.imshow("image", np)
cv2.waitKey()

当我尝试使用不同大小的图像时,我得到相同的结果(删除了9/10的数据)。

1 个答案:

答案 0 :(得分:2)

arr->nd计算数据中的前0(它是为空终止文本字符串设计的)。此外,如果它遇到的第一个0 数据完成之后,那么它将返回一个太大的数字,这意味着您可能会尝试写入您不拥有的数据。

要计算pyarrayobject的大小,您需要使用arr->dimensions计算维数,然后计算arr->descr(数组)以确定每个维度的大小。您还应该使用from sklearn.datasets import load_boston from sklearn.svm import SVR boston = load_boston() X = boston.data y = boston.target svr = SVR(kernel='linear') svr.fit(X,y); print('weights: ') print(svr.coef_) print('Intercept: ') print(svr.intercept_) 来计算数组的数据类型,而不是仅将其作为char进行测试。