【问题标题】:Get all combinations of list multiple arrays获取列出多个数组的所有组合
【发布时间】:2016-01-29 19:26:53
【问题描述】:

我有一个名为 X 的数字数组,形状为 (1, 19)。

我还有Xnp.log(X)1/(1+np.exp(-X))等函数。

我需要在数组中的每个项目上获取具有应用函数的数组的所有组合。

例如:

X = [ 1 2 3 ]

Y[1] = [ 1 2 3] Y[2] = [ ln(1) 2 3 ] Y[3] = [ 1 ln(2) 3 ] ... Y[k] = [ ln(1) ln(2) ln(3) ] ... Y[m] = [ 1 ln(2) exp(3)] ... Y[n] = [ exp(1) exp(2) exp(3) ]

有可能吗?

【问题讨论】:

  • 循环遍历列表并一个一个运行所有函数
  • 这种方式不可能得到这样的结果:[ ln(1) 2 ln(3) ] 不是吗?
  • 可以创建具有应用于所有元素的函数的数组,例如 Y[1] = X, Y[2] = ln(X), Y[3] = exp(X) 然后应用this method 但我不认为这是一个好的代码
  • 这是唯一的方法......我现在正在尝试:)
  • 如果你有一个 N 个数字和 M 个函数的列表来应用,我相信这将是 M^N 个不同的组合。在 N=19 和 M=3 的情况下,这将是 12 亿个数组

标签: python arrays loops numpy combinations


【解决方案1】:

这是使用列表理解的答案

import itertools
import math

def iden(x):
    return x

def log(x):
    return math.log(x)

def exp(x):
    return 1/(1+math.exp(-x))

X = [1, 2, 3]
funcs = [iden, log, exp]

def apply(functions, values):
    return [func(val) for func,val in zip(functions, values)]

values = [apply(f, X) for f in itertools.product(funcs, repeat=len(funcs))]

apply 函数似乎很有用。如果你不想要它,那么就可以了

values = [[func(val) for func,val in zip(f, X)] for f in itertools.product(funcs, repeat=len(funcs))]

样本输出

[1, 2, 3] # (iden, iden, iden)
[1, 2, 1.0986122886681096] # (iden, iden, log)
[1, 2, 0.95257412682243336] # (iden, iden, exp)
[1, 0.69314718055994529, 3] # (iden, log, iden)

【讨论】:

  • 谢谢!但 itertools.product(funcs, repeat=len(funcs)) 中有错误。应该是 (funcs, repeat=len(X))
  • 它们应该是相同的长度,所以没关系
  • 这很重要。 X 和 funcs 不一定,也不应该具有相同的长度
【解决方案2】:
functions=np.array([np.abs,lambda x : -x,np.square])
values=np.arange(3)
nf,nv=len(functions),len(values)
select=[[int(x) for x in np.base_repr(k,nf,nv)[-nv:]] for k in range(nf**nv)]
Y=[[f(x) for f,x in zip(functions[s],values)] for s in select]

选择有nf**nv 元素:

[[0, 0, 0],
 [0, 0, 1],
 [0, 0, 2],
 [0, 1, 0],
 [0, 1, 1],
 [0, 1, 2],
 [0, 2, 0],
 [0, 2, 1],
 [0, 2, 2],
 [1, 0, 0],
 [1, 0, 1],
 [1, 0, 2],
 [1, 1, 0],
 [1, 1, 1],
 [1, 1, 2],
 [1, 2, 0],
 [1, 2, 1],
 [1, 2, 2],
 [2, 0, 0],
 [2, 0, 1],
 [2, 0, 2],
 [2, 1, 0],
 [2, 1, 1],
 [2, 1, 2],
 [2, 2, 0],
 [2, 2, 1],
 [2, 2, 2]]

那么Y就是你想要的。

【讨论】:

    【解决方案3】:

    这是一个完全符合您要求的示例,但 X 尺寸要小得多,并且有 2 个功能:

    import math as m
    import numpy as np
    import itertools
    
    def RetX(x):
        return x
    
    def RetLogX(x):
        return m.log(x)
    
    if __name__ == '__main__':
        funcs = [RetX, RetLogX]
        funcsIdx = np.arange(len(funcs))
    
        arrayNumbers = [1, 2, 3]
        for combination in itertools.product(funcsIdx, repeat=len(arrayNumbers)):
            result = []
            for idx in range(len(combination)):
                func = funcs[combination[idx]]
                result.append(func(arrayNumbers[idx]))
            print(result)
    

    【讨论】:

    • 很确定你可以做到for combination in itertools.product
    • 你也不需要 numpy,真的。 range(len(funcs)) 会工作
    • 是的,虽然这不是问题,但它只是使用一个或另一个功能。这里的关键点是使用 itertools.product 和对函数数组进行索引的想法。
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多