2014-01-21 206 views
2

這個問題比找到具有實際代碼的解決方案稍微抽象一些。我想了解一些我正在使用的軟件的一些代碼。具體來說,我正在使用由3個其他3D數組索引的4D numpy數組。我讀過以下頁面:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html但是它並沒有真正涵蓋我正在處理的複雜性(或者我完全不理解它將其應用於我的情況)。使用數組索引Numpy數組

我的最終目標是將此代碼轉換爲C代碼,因此我需要了解如何訪問這些數組以便我可以將其轉換。有沒有人知道任何技巧或技巧閱讀這些numpy陣列與3D數組索引?我可以遵循一些程序來重建C中的一個numpy數組嗎?

任何幫助,將不勝感激!

僅供參考以下就是我處理:

state = history[delays, var, node, :]

history.shape = (4192, 2, 74, 1)

delays.shape = (74,1,74)

var.shape = (74,1,74)

node.shape = (74,1,74)

節點矩陣實際上只是 [[[ 0 0 0... 00]] [[ 1 1 1 ... 1 1]] [[ 2 2 2 ... 2 2]] ... [[73 73 73 ... 73 73 ]]] var矩陣全爲0。 延遲矩陣是各種值的所有整數模數4192.

謝謝!

回答

2

您的結果數組將具有形狀(74, 1, 74, 1)。看到delays數組的內容是否真的很有趣:它是否真的有5476個不同的值,還是隻有74個不同的值重複了74次?我問,因爲這實際上是varnode發生的事情。

如果他們都是不同的,同樣的索引未優化的C版會是這樣的:

float history[4192][2][74][1], state[74][1][74][1]; 
int delays[74][1][74]; 

for (int j = 0; j < 74; j++) { 
    for (int k = 0; k < 74; k++) { 
     state[j][k] = history[delays[j][0][k]][0][k][0]; 
    } 
} 

如果delays是不是一個真正的二維數組,但一維數組通過邊重複74次邊,也就是說,如果np.all(np.equal.reduce(delays, axis=1))回報True,那麼你就可以簡化上述代碼如下:

float history[4192][2][74][1], state[74][1][74][1]; 
int delays[74]; /* keep only the unique values */ 

for (int j = 0; j < 74; j++) { 
    for (int k = 0; k < 74; k++) { 
     state[j][k] = history[delays[j]][0][k][0]; 
    } 
} 
1

假設我有一個4x4x4x4的numpy數組'a'。然後:

repr(a).replace('[', '{').replace(']', '}').replace('\n', '') 

打印出準備用於消費的陣列中C.

double a[4][4][4][4] = {{{{ 6.92719862e-01, 2.76015214e-01, 7.01148124e-01,   2.56710822e-01}, ....... 

索引將具有在兩個相同的座標,所以a[(0,1,2,3)]在python將是相同的在C a[0][1][2][3](和在事實上你可以在後兩者中使用後者的語法)。

+0

,對於陣列轉移了,如果它是靜態的(它幫助我在另一種情況下)是偉大的,但是我想實際轉移那行代碼轉到C.我已經有用C構造的歷史[] [] [] [],但我不確定如何訪問它,因爲我在閱讀numpy的時候遇到了麻煩。 – user1220086

+0

你能舉一個你用來索引到你的4d數組的例子嗎? – U2EF1

+0

我編輯了原始問題以包含數組的樣子。謝謝:) – user1220086