使用ctypes快速迭代矩阵的列

时间:2014-04-10 09:14:25

标签: python numpy ctypes

让A成为矩阵

import numpy as np
A = np.matrix([[3.0, 1.0, 2.0, 0.0], [2.0, 1.0, 3.0, 1.0], [0.0, 2.0, 0.0, 3.0]])

[[ 3.  1.  2.  0.]
 [ 2.  1.  3.  1.]
 [ 0.  2.  0.  3.]]

我正面对一个复杂的库(基于ctypes接口),除了我指出矩阵的列之外,例如:

import ctypes

for j in range(0,4):
    a = np.copy(A[:,j])
    lib.DoSomething(a.ctypes.data_as(ctypes.POINTER(ctypes.c_double)))

显然我很想避免将列复制到变量a中。我想有很多聪明的想法?也许我应该转置和复制矩阵?或者有没有办法可以将它存储在列中?

托马斯

2 个答案:

答案 0 :(得分:4)

您可以按Fortran顺序存储矩阵,因此列是连续的。然后只需将视图传递给该连续列。

A = np.array([[3.0, 1.0, 2.0, 0.0], [2.0, 1.0, 3.0, 1.0], [0.0, 2.0, 0.0, 3.0]], order='F')
for j in range(0, 4):
    a = A[:, j]

此外,除非您真的需要,否则请避免使用np.matrix。这是一个臭虫磁铁。

答案 1 :(得分:2)

所以numpy只会按行主要顺序存储您的数据。如果要避免复制操作,可以执行以下操作:

编辑:所以上面的陈述是无稽之谈,简单的答案只是设置order='F',如上面的答案。

import numpy as np

# avoid matrix and define the dtype at the start so you don't have an extra copy
A = np.array([[3.0, 1.0, 2.0, 0.0], [2.0, 1.0, 3.0, 1.0], [0.0, 2.0, 0.0, 3.0]],dtype="float64",order="F")

for row in A.transpose():
    lib.DoSomething(np.ctypeslib.as_ctypes(row))