Python中的笛卡尔积

时间:2018-11-16 19:42:19

标签: python itertools combinatorics cartesian-product

我正在尝试绘制“星条”问题的散点图。在X轴上,我有“要分发糖果的孩子数”,在Y轴上有“要分发糖果的数目”。在Z轴上,我有“多种分配方式。

我使用嵌套的for循环来生成用于绘制的数据集:

import itertools as it
import math
import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x_coordinate = np.arange(16)
y_coordinate = np.arange(16)
dataset = []
for i in range(10):
    for j in range(10):
    mylist = [item for item in it.product(range(i), repeat = j) if sum(item) == (i-1)]
    z_value = len(mylist) 
    x_value = i
    y_value = j
    dataset.append((x_value, y_value, z_value))  
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x = [item[0] for item in dataset]
y = [item[1] for item in dataset]
z = [item[2] for item in dataset]
ax.scatter(x,y,z,c='r')
ax.set_xlabel('Candies')
ax.set_ylabel('Children')
ax.set_zlabel('Search space')

问题是当我检查数据集时,我看到诸如(1,5,1),(1,6,1)等条目,这暗示着有一种方法可以在5个孩子中分配1个糖果,或者一种在6个孩子中分配1个糖果的方法。但这是不正确的,有5种方法在5个孩子中分配1个糖果,还有6种方法在6个孩子中分配1个糖果。当然,我在这里做错了非常严重的事,但我无法弄清楚。

1 个答案:

答案 0 :(得分:1)

您的mylist计算正在寻找将i-1糖果分配给j个孩子而不是i糖果的所有方法。在5个孩子,6个孩子或任意数量的孩子之间分配0个糖果的方法是完全正确的一种方法:没人能得到任何东西。