生成所有可能组合(物种组合)的numpy数组

时间:2019-04-29 10:26:16

标签: python numpy

我要生成一个numpy数组,该数组表示以下条件的潜在物种组合(每行是一个组合):每个组合最多包含5个物种,每个物种最多包含50个个体(以10为步长)。因此,最终数组应具有5列(代表五个种类中的每一个),并且每个单元格中的值可以为{0,10,20,30,40,50}。所有可能的组合都应在数组中表示。

我设法在R中做到了很简单,但是由于需要进一步处理(对于更大的数据集,n> 35 * 10 ^ 6行),我想切换到python来改善计算时间(使用一些scipy-biodiversity函数)。

这是我想翻译成Python等效语言的相当简单的R代码:

Assemblage_generated <- expand.grid(seq(0,50,10),seq(0,50,10),seq(0,50,10),seq(0,50,10),seq(0,50,10))

是否有专门用于执行此类操作的特定Python函数?

2 个答案:

答案 0 :(得分:2)

我相信您正在寻找的是Cartesian product(我看到“ jdehesa”在我之前提出了这个建议)。如链接中所示,这可以通过多种方式来实现,具体取决于速度要求。

针对您的问题的快速而肮脏的解决方案可能是:

import numpy as np
import itertools

lst = list(itertools.product(*[np.arange(0, 60, 10, dtype='int') for i in range(5)]))

# Compare with output from R:
for (i, li) in enumerate(lst):
    print(i, li)

答案 1 :(得分:1)

您可以选择两种方法来执行此操作:

  1. 使用numpy.meshgrid(我认为它是最快的)
from itertools import repeat
import numpy as np

val = list(range(0, 60, 10))

res = np.stack(np.meshgrid(*repeat(val, 5)), -1).reshape(-1, 5)
  1. 使用itertools产品
from itertools import product, repeat
import numpy as np

val = list(range(0, 60, 10))

res = np.array(list(product(*repeat(val, 5))), dtype='int32')