python - 根据有放回的组合计算列的乘积

标签 python matlab loops combinations combinatorics

问题

解释起来有点困难,但我会尽力而为。我知道找到替换组合数的方程式。假设我有 6 个向量:A、B、C、D、E、F。如果我想找到这 6 个变量的所有可能的三次乘积,它将是 (6+3-1)!/3!(6- 1)! = 56 种组合(见结尾)。同样,如果我想要每个二次积,它是 21。对于线性,当然是 6(只是每个变量本身)。我想计算所有 6+21+56 = 83 种组合。我正在考虑 3 个循环,每个内部循环都从其外部循环开始迭代,如

for i1=1:6
   X(:,?) = X.*X(:,i1)
   for i2=i1:6
      X(:,?) = X.*X(:,i2)
      for i3=i2:6
         X(:,?) = X.*X(:,i3)

但是左侧存储所有数据的 83 列矩阵的索引让我感到困惑。如您所见,它们标有问号。

PS:可能也需要对 5 阶执行此操作,因此它会添加另外 126 和 252 列,总共 461 列。因此,不对三阶进行硬编码的更通用的代码更好。但如果它被硬编码到第 5 位也没关系,因为我绝对不会超过那个。

MATLAB 或 Python 都可以,因为我可以在两者之间轻松切换。

用例子计算二次组合

这是我期望的 6 个变量(A 到 F)的二次组合的 21 列示例。在 Excel 中完成。我为每个向量取了 3 个样本。 enter image description here

立方组合列表

这里是我需要计算的 56 种组合:

一个,一个,一个

A,A,B

A,A,C

一个,一个,一个

A,A,E

一个,一个,一个

A,B,B

A,B,C

A,B,D

A,B,E

A,B,F

A,C,C

A,C,D

A,C,E

A,C,F

A,D,D

A,D,E

A,D,F

A,E,E

A,E,F

一个,一个,一个

B,B,B

B,B,C

B,B,D

B,B,E

B,B,F

B,C,C

B,C,D

B,C,E

B,C,F

B,D,D

B,D,E

B,D,F

B,E,E

B,E,F

B,F,F

C,C,C

C,C,D

C,C,E

C,C,F

C,D,D

C,D,E

C,D,F

C,E,E

C,E,F

C,F,F

D,D,D

D,D,E

D,D,F

D,E,E

D,E,F

D,F,F

E,E,E

E,E,F

E,F,F

我,我,我

最佳答案

这是 Matlab 中的矢量化方法。它应该很快,但内存效率不高,因为它会生成列索引的所有笛卡尔元组,然后只保留那些非递减的。

x = [2 2 3 2 8 8; 5 1 7 9 4 4; 4 1 2 7 2 9]; % data
P = 2; % product order
ind = cell(1,P);
[ind{end:-1:1}] = ndgrid(1:size(x,2)); % Cartesian power of column indices with order P
ind = reshape(cat(P+1, ind{:}), [], P); % 2D array where each Cartesian tuple is a row
ind = ind(all(diff(ind, [], 2)>=0, 2), :); % keep only non-decreasing rows
result = prod(reshape(x(:,ind.'), size(x,1), P, []), 2); % apply index into data. This
% creates an intermediate 3D array. Compute products
result = permute(result, [1 3 2]); % convert to 2D array

关于python - 根据有放回的组合计算列的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62907698/

相关文章:

python - 如果我在 python 中有 10 个虚拟环境,是否会下载相同的库 10 次?

matlab - 在不使用内置函数的情况下在 matlab 中进行互相关?

java - 在 Matlab 中使用 Java PriorityQueue

python cv2 未找到但已安装

python - unittest - 比较列表而不考虑顺序

r - 将列表转换为多个数据框,以便能够仅将每个数据框的一列转换为数字数据

java - 我的循环用数字七、六次填充数组,为什么?

java - 如何让用户结束这个程序?

python - 轴刻度不会随 matplotlib 改变

matlab - 基于特定用户选择维数的子数组