Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numba中的笛卡尔积_Python_Itertools_Numba_Cartesian Product - Fatal编程技术网

Python Numba中的笛卡尔积

Python Numba中的笛卡尔积,python,itertools,numba,cartesian-product,Python,Itertools,Numba,Cartesian Product,我的代码使用如下列表的笛卡尔乘积: import itertools cartesian_product = itertools.product(list('ABCDEF'), repeat=n) n可以是0到4之间的任何值 numba目前不支持itertools.product。到目前为止,我还无法想出一个可行的替代方案。欢迎提出任何建议 笛卡尔积可以看作是长度为1到5(0到4?)的基数6,如331或40302 可能的组合数量为6^5,从00000(基数6)到55555(基数6)或AAAA

我的代码使用如下列表的笛卡尔乘积:

import itertools

cartesian_product = itertools.product(list('ABCDEF'), repeat=n)
n
可以是0到4之间的任何值


numba
目前不支持
itertools.product
。到目前为止,我还无法想出一个可行的替代方案。欢迎提出任何建议

笛卡尔积可以看作是长度为1到5(0到4?)的基数6,如331或40302

可能的组合数量为6^5,从00000(基数6)到55555(基数6)或AAAA到FFFFF

因此,如果您确实需要它们作为列表,请生成从0到6^5-1的数字,即十进制7775,并将每个数字映射到相应的代码

例如,对于十进制数127,模6是1。 127 / 6 => 21, 21 % 6 => 3 21 / 6 => 3 (3<6,我们完成了)

因此,我们的基数-6是331,对于映射a:0,B:1。。。F:5,所以DDB


根据您的用例,一次构建整个列表将更加有效。对于非常大的笛卡尔积,仅使用从数字到元素的映射并知道列表的最大索引(m^n)可能更有效。

以下是解决问题的一种方法。有两个numba函数:一个用于常规笛卡尔积(数组列表),另一个用于简单数组的repeat参数。这是一些代码的改编

@nb.njit(nb.int32[:,:](nb.int32[:]))
def cproduct_idx(尺寸:np.ndarray):
“”“为笛卡尔乘积生成ids元组”“”
断言长度(大小)>=2
元组计数=np.prod(大小)
tuples=np.zero((tuples\u count,len(size)),dtype=np.int32)
tuple_idx=0
#存储当前的组合
当前数组=np.零(长度(大小))
而tuple_idx
下面是最后一个函数执行的示例:

>>> cartesian_product_repeat(np.arange(2), 3)

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