【发布时间】: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