Перебор списка массивов для использования в качестве входных данных в функции

#python-3.x #numpy

Вопрос:

В приведенном ниже коде, как я могу выполнить итерацию y , чтобы получить все 5 групп по 2 массива в каждой для использования в качестве входных данных func ?

Я знаю, что мог бы просто сделать :

 func(y[0],y[1]) func(y[2],y[3])...etc....  

Но я не могу закодировать строки выше, потому что у меня могут быть сотни массивов в y

 import numpy as np import itertools  # creating an array with 100 samples array = np.random.rand(100)  # making the array an iterator iter_array = iter(array)  # Cerating a list of list to store 10 list of 10 elements each n = 10 result = [[] for _ in range(n)]  # Starting the list creating for _ in itertools.repeat(None, 10):  for i in range(n):  result[i].append(next(iter_array)) # Casting the lists to arrays  y=np.array([np.array(xi) for xi in result], dtype=object)  #list to store the results of the calculation below result_func =[]  #applying a function take takes 2 arrays as input  #I have 10 arrays within y, so I need to perfom the function below 5 times: [0,1],[2,3],[4,5],[6,7],[8,9] a = func(y[0],y[1])  # Saving the result result_func.append(a)  

Ответ №1:

Вы могли бы использовать понимание списка:

 result_func = [func(y[i], y[i 1]) for i in range(0, 10, 2)]  

или общий цикл for:

 for i in range(0, 10, 2):  result_func.append(funct(y[i], y[i 1]))  

Ответ №2:

Из-за порядка заполнения numpy при изменении формы вы можете изменить массив, чтобы он имел

  • переменная глубина (в зависимости от количества массивов)
  • высотой в два
  • такая же ширина, как и количество элементов в каждой входной строке

Таким образом, при заполнении он заполнит две строки, прежде чем потребуется увеличить глубину на одну.

Итерация по этому массиву приводит к созданию серии матриц (по одной для каждого углубленного слоя). Каждая матрица имеет две строки, которые, как выясняется y[0], y[1] y[2], y[3] , и так далее.

Для примера скажем, что каждый внутренний массив имеет длину 6, и что всего их 8 (так что есть 4 вызова функций).:

 import numpy as np elems_in_row = 6 y = np.array(  [[1,2,3,4,5,6],  [7,8,9,10,11,12],  [13,14,15,16,17,18],  [19,20,21,22,23,24],  [25,26,27,28,29,30],  [31,32,33,34,35,36],  [37,38,39,40,41,42],  [43,44,45,46,47,48], ]) # the `-1` makes the number of rows be inferred from the input array. y2 = y.reshape((-1,2,elems_in_row))  for ar1,ar2 in y2:  print("1st:", ar1)  print("2nd:", ar2)  print("")  

выход:

 1st: [1 2 3 4 5 6] 2nd: [ 7 8 9 10 11 12]  1st: [13 14 15 16 17 18] 2nd: [19 20 21 22 23 24]  1st: [25 26 27 28 29 30] 2nd: [31 32 33 34 35 36]  1st: [37 38 39 40 41 42] 2nd: [43 44 45 46 47 48]   

В качестве примечания, если ваша функция выводит простые значения (например, целые числа или плавающие) и не имеет побочных эффектов, таких как ввод ввода-вывода, возможно, можно использовать apply_along_axis для создания выходного массива напрямую, без явного перебора пар.

Комментарии:

1. извините, я несколько раз ошибался, когда писал это, но на этот раз я уверен, что это сработает.