【问题标题】:How to iteratively nest a nested function如何迭代嵌套嵌套函数
【发布时间】:2020-03-10 09:43:43
【问题描述】:

我有一个多维数组arr_multi_dim。每增加一个参数n,数组结果中就会创建更多的条目,数组也会变大。

随着n 的每次增加,我需要在数组arr_multi_dim 上执行函数np.concatenate(),这样每次n 增加时都会嵌套更多的np.concatenate() 函数。

例如,

当 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)

等等

n 每增加一次,就会将一对np.concatenate()(即两个)添加到函数中。

如何编写函数、循环(或类似的东西),以便当我为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

【问题讨论】:

  • 你能提供一个你想要的输入/输出的例子吗?就像您的结果和 n 以及您想要的输出一样,我认为一定有比多次调用 concatenate 更简单的方法
  • 你能模拟一下results 的样子吗?
  • 嗨@S.Mohsensh,我已按要求更新了上面的问题。这段代码正在做一个自我克罗内克积(即,它自己的矩阵的克罗内克积)。我正在尝试是否可以为此编写自己的代码并将其并行化。非常感谢。
  • 嗨@dzang,我已按要求更新了我上面的问题。这段代码正在做一个自 Kronecker 乘积(即,它自己的矩阵的 Kronecker 乘积,n 表示执行 Kronecker 乘积的次数)。我正在尝试是否可以为此编写自己的代码并将其并行化。非常感谢。
  • @Leockl 谢谢,您能否将导入添加到所需的函数中以重现您的示例?

标签: python numpy loops for-loop concatenation


【解决方案1】:

如果我理解正确的话,这很简单:

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)

因为前两次迭代只添加了一层,而其余的添加了两层

【讨论】:

  • 感谢@Nullman 指出正确的方向。现在计算出 for 循环中的计数器应该取什么值。
  • @Leockl 我用我认为在你的情况下正确的计数器更新了我的答案
  • 非常感谢@Nullman。我现在感觉很愚蠢,因为我无法看到这一点。
猜你喜欢
  • 2015-10-17
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2014-10-22
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多