【发布时间】:2020-07-12 22:51:00
【问题描述】:
我研究了这个问题,人们一直建议使用np.meshgrid() 来查找数组的所有可能组合。但问题是np.meshgrid() 不产生组合它产生产品(类似于 itertools.product())
在组合中,元素是不重复且无序的
arr = np.arange(5)
r = 3
这些是组合的样子
np.array(
list(itertools.combinations(arr, r))
)
>>> [[0, 1, 2],
[0, 1, 3],
[0, 1, 4],
[0, 2, 3],
[0, 2, 4],
[0, 3, 4],
[1, 2, 3],
[1, 2, 4],
[1, 3, 4],
[2, 3, 4]]
以下不是组合
np.array(
list(itertools.product(arr, arr, arr))
)
>>> [[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 0, 3],
[0, 0, 4],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
....,
[4, 3, 2],
[4, 3, 3],
[4, 3, 4],
[4, 4, 0],
[4, 4, 1],
[4, 4, 2],
[4, 4, 3],
[4, 4, 4]])
np.array(
np.meshgrid(arr, arr, arr)
).transpose([2, 1, 3, 0]).reshape(-1, r)
>>> [[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 0, 3],
[0, 0, 4],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
....,
[4, 3, 2],
[4, 3, 3],
[4, 3, 4],
[4, 4, 0],
[4, 4, 1],
[4, 4, 2],
[4, 4, 3],
[4, 4, 4]])
对于r = 2,我找到了一种寻找组合的好方法
np.array(
np.triu_indices(len(arr), 1)
).T
>>> [[0, 1],
[0, 2],
[0, 3],
[0, 4],
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4]]
但是我很难为r > 2找到任何矢量化方法
注意: 即使我的数组不是
[0, 1, 2, 3, 4],我也可以使用上述答案作为索引。
如果它有助于想象,
对于r = 2,所需答案是大小为len(arr) 的方阵的右上角三角形的索引,忽略对角线。
对于r = 3,所需答案是大小为len(arr) 的 3d 数组(您猜对了)的右上角四面体(图像中的中间)的索引,忽略对角线的 3d 等效项。
【问题讨论】:
-
“排列”?
from itertools import permutationslist(permutations(arr, 3))也许。 -
排列与组合不同,我正在寻找矢量化的实现,所以
itertools是不行的。 -
@Hammad 你有什么理由需要矢量化它吗?
-
@Ehsan 我有一个大数据集,所以我想避免循环和生成器
标签: python numpy vectorization combinations computational-geometry