2014-04-10 53 views
4

一個矩陣的列快速迭代法設A是一個矩陣在與ctypes的

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

@ebarr是它可能,它只是沒有默認值。見Davidmh的回答。 – jorgeca

+0

你在說什麼適用於修改步幅。如果你去了數組的文檔,「如果order是'C'(默認),那麼數組將會是C連續的順序(last-index會變化最快)。如果order是'F',那麼返回的數組將採用Fortran連續順序(首先指數變化最快)。「速度差異是由於數據的實際內存佈局造成的。 – Davidmh

+0

@Davidmh道歉,你是現貨。我誤解了文檔,但只是做了一個快速測試,我發現它工作正常。我刪除了我原來的評論,以免人們誤入歧途。 – ebarr

回答

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除非你真的很需要它。這是一個臭蟲磁鐵。

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)) 
+0

Numpy可以按行和列主要的順序存儲數據。請參閱文檔:http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html 而且您不避免複製,您只是一起完成所有複製,因此需要複製內存(但也許更好的表現,我沒有檢查)。 – Davidmh

+0

是的,我的壞。我已更新以反映這一點。 – ebarr