Как итеративно вкладывать вложенную функцию - PullRequest
0 голосов
/ 10 марта 2020

У меня есть массив arr_multi_dim, который является многомерным. Каждый раз, когда я увеличиваю параметр n, в результатах массива будет создаваться больше записей, и массив будет увеличиваться.

С каждым увеличением n мне нужно выполнить функцию np.concatenate() на массив arr_multi_dim, таким образом, что будет увеличиваться число вложенных функций np.concatenate() при каждом увеличении n.

Например,

при n = 2:

arr_multi_dim = np.concatenate(np.concatenate(arr_multi_dim, axis=1), axis=1)

при n = 3:

arr_multi_dim = np.concatenate(np.concatenate(
                np.concatenate(np.concatenate(arr_multi_dim, axis=1), axis=1), axis=1), axis=1)

при n = 4:

arr_multi_dim = np.concatenate(np.concatenate(
                np.concatenate(np.concatenate(
                np.concatenate(np.concatenate(arr_multi_dim, axis=1), axis=1), axis=1), axis=1), axis=1), axis=1)

et c.

где при каждом приращении из n, пара np.concatenate() (ie. two) добавляется в функцию.

Как написать функцию, цикл (или что-то подобное), чтобы при указании любого значения для n, будет использоваться соответствующая функция np.concatenate()?

Заранее большое спасибо.

Редактировать:

Это полный код, который я написал и который использует вышеуказанную функцию np.concatenate().

from itertools import product
from joblib import Parallel, delayed
from functools import reduce
from operator import mul
import numpy as np

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(lst)
n = 2

def test1(arr, n):
    flat = np.ravel(arr).tolist()
    gen = (list(a) for a in product(flat, repeat=n))

    results = Parallel(n_jobs=-1)(delayed(reduce)(mul, x) for (x) in gen)

    nrows = arr.shape[0]
    ncols = arr.shape[1]

    arr_multi_dim = np.array(results).reshape((nrows, ncols)*n)
    arr_final = np.concatenate(np.concatenate(arr_multi_dim, axis=1), axis=1)  # need to generalise this

    return arr_final

Приведенный выше код работает только для n = 2. Я пытаюсь обобщить часть кода np.concatenate, чтобы он работал для любого n, как указано выше.

1 Ответ

1 голос
/ 10 марта 2020

Если я правильно вас понял, все довольно просто:

arr_multi_dim = results
for i in range(n):
  if i < 2:
    arr_multi_dim = np.concatenate(arr_multi_dim , axis=1)
  else:
    arr_multi_dim = np.concatenate(np.concatenate(arr_multi_dim , axis=1), axis=1)

, потому что первые две итерации добавляют только один слой, а остальные добавляют два слоя

...