让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中。我想有很多聪明的想法?也许我应该转置和复制矩阵?或者有没有办法可以将它存储在列中?
托马斯
答案 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))