【问题标题】:Magic is happening when numpy array is altering by C function当 numpy 数组被 C 函数改变时,魔法正在发生
【发布时间】:2017-03-26 00:10:28
【问题描述】:

我正在尝试将 numpy 数组传递给我想要更改数组值的 C 函数。但我必须将索引乘以 2 才能使其正常工作。为奇数索引分配一个值(让它为i)会导致将一个垃圾分配给索引(i-1)/2。这是源代码。

C:

#include "assign_array.h"

void assign(int *arr, int i) {
    arr[i] = 2017;
}

Python:

import ctypes, numpy
lib2 = ctypes.cdll.LoadLibrary('./assign_array.so')
for i in range(5):
    array = numpy.zeros(8, dtype = int)
    ptr = array.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
    print('i = {}:'.format(i))
    lib2.assign(ptr, i)
    print(array)

Screenshot

为什么会这样?

【问题讨论】:

    标签: python c numpy ctypes


    【解决方案1】:

    这不是完全垃圾:20470x7e186629490360320x7E100000000。看起来好像您正在混合不同的 C 编译器(或提供给 C 编译器的标志),因此 Python 认为 int 是 64 位,但您的 C 编译器认为 int 是 32 位。虽然事实上,Python 中的 int 不能保证与 C 编译器中的 int 匹配;它可能更典型地匹配long

    根据the numpy documentationdtype可以指定为numpy.int32,专门指一个32位的int。这可能是处理此问题的最简单方法,或者您当然可以更改 C 代码以使用 long(假设您的 C 编译器设置为 64 位 longs)。

    【讨论】:

    • 我是这样编译的:gcc -shared -o assign_array.so -fPIC assign_array.c
    • 这表明(尽管不能证明)您使用的是 Linux/Unix-ish 系统,因此您的基础 Python 可能使用 C long 作为其内部 int 类型,而您的基础C 编译器有 64 位 long。其他 C 编译器类似。
    • @MatteoItalia:查看带括号的更新:Python int 最有可能映射到 C long。 (确实,64 位 int 很少见;Cray 就是其中之一。)
    • 哦,将 dtype 设置为 numpy.int32 解决了这个问题。谢谢。
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多