numpy和ctypes:处理观点

时间:2016-12-19 00:14:46

标签: python c numpy ctypes

我使用ctypes在C和Python + numpy之间进行交互。双方的代码都是我写的。通常它按预期工作,但我遇到了一个我不理解的奇怪的错误。

我的问题是:发生了什么事?

我正在使用gcc 6.2.1开发Linux(Manjaro 16.10)。 python 2.7.12和numpy 1.11.2。

我的C代码的简化版本:

void imp(double *M) {/*do stuff, assumes M is a 3x3 row-major matrix*/}

我的Python代码的简化版本:

lib = ctypes.CDLL('path/to/lib.so')

def function(M):
    assert(M.dtype == np.float64)
    lib.imp(M.ctypes.data_as(ctypes.POINTER(ctypes.c_double)))

# Snippet 1: Doesn't work correctly, gives nonsense results.
print my_var.dtype  # prints 'float64'
print my_var.shape  # prints '(3, 3)'
function(my_var)    # the assert in function doesn't fail

# Snippet 2: Works correctly, gives the expected results.
my_var = my_var.astype(np.float64) # (!!)
print my_var.dtype  # The same...
print my_var.shape  # ...as in...
function(my_var)    # ...snippet 1

更新

更换

my_var = my_var.astype(np.float64)

my_var = my_var.copy()

同样适用。显然,问题的根源是my_var是一个numpy的视图(我通过打印my_var.base检查了这一点)。

所以我修改过的问题是:如果那些数组实际上是视图,那么传递带有ctype的numpy数组的正确方法是什么?在调用c函数之前复制所有参数是不可避免的吗?

1 个答案:

答案 0 :(得分:1)

查看numpy.ascontiguousarray和相关的numpy.as*函数。这些将在必要时制作副本,以使您的数据成为您的函数的一个很好的形式,但如果数组都很好,那么它们将被单独保留。

有用的参考资料: