为什么我在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的数据)。
答案 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进行测试。