Возврат произвольной строки из многомерного массива (PYTHON)

Я работаю с 5-мерным массивом размером 5x5x5x5x5 в python.

Как я могу сделать функцию, которая

  • примет целое число i (1‹=i‹=5), для которого будет выполняться итерация, и список других 4 измерений [a,b,c,d], которые будут заблокированы
  • вернуть одномерный список длины 5

Например:

>>>bb = (5-мерный массив)

>>>Извлечение строки(3, [2,3,0,2], bb)

*[ bb[2][3][i][0][2] для i в диапазоне (5)] возвращает*

3 для 3-го измерения, а 2,3,0,2 означает другие измерения.

Я мог бы сделать это, жестко запрограммировав 5 разных сценариев, но есть ли более простой способ?


person marlont    schedule 01.09.2017    source источник


Ответы (3)


Ниже приведен один из способов использования циклов.

def extract_row(row, arr, bb):
  N = len(arr) + 1

  pre_mat = bb
  for i in range(row):
    pre_mat = pre_mat[arr[i]]

  ans = [] 
  for i in range(N):
    mat = pre_mat[i]
    for j in range(row + 1, N):
      mat = mat[arr[j - 1]]

    ans.append(mat)

  return ans
person Alex    schedule 01.09.2017

Я думаю, что другого пути нет. Итак, что-то вроде этого

def extractRow(row, arr, bb):
    if row == 0:
        return [bb[i][arr[0]][arr[1]][arr[2]][arr[3]] for i in range(5)]
    elif row == 1:
        return [bb[arr[0]][i][arr[1]][arr[2]][arr[3]] for i in range(5)]
    ...
person campovski    schedule 01.09.2017
comment
Хм, согласен. Я не видел такой проблемы больше нигде в Интернете. Похоже, Python не поддерживает такую ​​конкретную проблему. Благодарю вас! - person marlont; 01.09.2017

Одно из возможных решений использует итератор для создания последовательности индексов. «Отсутствующее» измерение можно вставить в arr, и каждый раз, проходя цикл генератора, он заполняет этот индекс следующим значением. Каждый раз, когда генератор дает результат, он создает массив из 5 элементов, содержащий индексы, необходимые для извлечения следующего значения из bb. Затем вы можете выбрать нужный элемент из bb.

def extract_row(row, bb, arr):
    retval = []
    for a0, a1, a2, a3, a4 in iter_indices(row, arr):
        retval.append(bb[a0][a1][a2][a3][a4])
    return retval

def iter_indices(row, arr):
    arr.insert(row, None)
    for i in range(5):
        arr[row] = i
        yield arr

# TEST CODE FOLLOWS
g = 0
def deepen(b, n):
    global g
    if n == 1:
        b.append(g)
        b.append(g+1)
        b.append(g+2)
        b.append(g+3)
        b.append(g+4)
        g += 5
        return b
    for m in range(5):
        b.append(deepen([], n-1))
    return b

a = []
deepen(a, 5)

# Run it using the test matrix a
print(extract_row(1, a, [1, 2, 3, 4]))
print(a[1][0][2][3][4], a[1][1][2][3][4], a[1][2][2][3][4], a[1][3][2][3][4], a[1][4][2][3][4])


Output is:
[694, 819, 944, 1069, 1194]
694 819 944 1069 1194
person Paul Cornelius    schedule 01.09.2017