【问题标题】:Why my PyArrayObject* data truncated?为什么我的 PyArrayObject* 数据​​被截断?
【发布时间】:2016-08-18 14:32:05
【问题描述】:

为什么我的 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 的数据)。

【问题讨论】:

  • 你为什么打电话给strlen?你不是在处理一个字符串。
  • 我试图在 for 循环中更改这个数组,如果我超过 25313,它会崩溃,并且只有 1/10(大约)的图像是变化的。(我认为字符串只是连续的字节。 )
  • @Anatoly C 字符串是\0 终止的char 数组。 strlen 和其他 str* 函数旨在处理此类数据。无法获取数组的大小(好吧,除非它是固定大小的数组,在这种情况下,您可以使用其类型中的sizeof)。您必须明确跟踪其大小。如答案所示,numpy 数组是 multidimensional 数组,因此它们会跟踪每个维度的大小,您必须处理它。
  • 现在我明白了,谢谢!

标签: python c numpy


【解决方案1】:

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

要计算出 pyarrayobject 的大小,您需要使用 arr-&gt;nd 计算维数,然后使用 arr-&gt;dimensions(一个数组)计算每个维的大小。您还应该使用arr-&gt;descr 来确定您的数组是什么数据类型,而不仅仅是将其测试为 char。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多