微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

生成两个列表的所有可能组合的一个热矩阵?

如何解决生成两个列表的所有可能组合的一个热矩阵?

假设我有一个矩阵(数组),其中元素位于集合 {0,1} 中,受所有行和列的总和为 1 的约束。

matches = np.array([[0,1],[1,0],[0,1,0]])

有没有办法生成满足上述约束的所有可能的矩阵?

这是从一个模糊相关的question/answer中汲取灵感的天真尝试,

import itertools

a = ['A','B','C']
b = ['X','Y','Z']

def get_permutations(a,b):
  index_map = {val:idx for idx,val in enumerate(a)}
  index_map.update({val:idx for idx,val in enumerate(b)})
  
  perms = [list(zip(x,b)) for x in itertools.permutations(a,len(b))]
  possible = []
  for p in perms: 
    temp_arr = np.zeros([len(a),len(b)])    
    for tup in p:
      x,y = index_map[tup[0]],index_map[tup[1]]
      temp_arr[x,y] = 1
    possible.append(temp_arr)
  return possible 


get_permutations(a,b) 

>>>
[array([[1.,0.,0.],[0.,1.,1.]]),array([[1.,1.],0.]]),array([[0.,[1.,0.]])]

我的问题是:是否有更简洁或更快速方法来返回满足上述约束的数组列表?

解决方法

您的解决方案似乎相当快,可以纠正的事情并不多。 这是我想出来的

import itertools
import numpy as np

a = ['A','B','C']
b = ['X','Y','Z']

def get_permutations(a,b):
    n = len(a)
    possible = []
    for perm in itertools.permutations(range(n),n):
        matrix = np.zeros([n,n])
        i = 0
        for j in perm:
            matrix[i,j] = 1
            i += 1
        possible.append(matrix)
    return possible

get_permutations(a,b)

虽然您的答案平均需要 3.17784857749939e-05 秒,但我的答案需要 9.6732497215271e-06 秒(10000 个测试样本)。差别真的很小,但如果你真的需要最快的解决方案,请考虑这个。

确实最慢的部分是 itertools.permuatations(),但我还没有找到具有相当速度优势的替代方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。