2014-01-21 9 views
2

Этот вопрос немного более абстрактный, чем поиск решения с реальным кодом. Я пытаюсь понять некоторый код для некоторого программного обеспечения, с которым я работаю. В частности, я работаю с массивом 4D numpy, который индексируется тремя другими 3D-массивами. Я прочитал следующую страницу: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html, однако на самом деле она не охватывает сложность того, с чем я имею дело (или я не понимаю ее полностью, чтобы применить ее к моей ситуации).Индексирование массивов массивов с массивами

Моя конечная цель - преобразовать этот код в код C, и поэтому мне нужно понять, как эти массивы доступны, чтобы я мог его преобразовать. Кто-нибудь знает какие-либо трюки или советы по чтению этих массивов numpy с индексированием 3D-массива? Есть ли какая-то процедура, которую я могу выполнить для восстановления массива numpy в C?

Любая помощь будет оценена!

Для справки следующее, что я имею дело с:

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 раза? Я спрашиваю, потому что это на самом деле то, что происходит с var и node.

Если все они различны, неоптимизированной версия 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 не действительно 2D массив, но 1D массив повторяется 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', '') 

распечатывает Массив готовый к употреблению в С.

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

Индексация будет иметь те же координаты в обоих, так что a[(0,1,2,3)] в питоне будет таким же, как a[0][1][2][3] в C (и в факт, вы можете использовать последний синтаксис в обоих).

+0

это отлично подходит для передачи массива более, если это были статичными (что поможет мне в другом случае), но я хочу на самом деле передачи эта строка кода до С.У меня уже есть история [] [] [] [], построенная на C, но я не уверен, как получить к ней доступ, потому что у меня проблемы с чтением того, как используется numpy. – user1220086

+0

Можете ли вы привести пример массива, который вы используете для индексации в ваш 4d-массив? – U2EF1

+0

Я отредактировал исходный вопрос, чтобы включить то, как выглядят массивы. Спасибо :) – user1220086

Смежные вопросы