我要生成一个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函数?
答案 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)
您可以选择两种方法来执行此操作:
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)
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')