#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. извините, я несколько раз ошибался, когда писал это, но на этот раз я уверен, что это сработает.