【问题标题】:Cartesian product in PythonPython中的笛卡尔积
【发布时间】:2019-04-20 00:37:29
【问题描述】:

我正在尝试绘制“星条形”问题的散点图。在 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 个糖果,或者1 种方法在 6 个孩子中分配 1 个糖果。但这不是真的,有 5 种方法可以将 1 颗糖果分配给 5 个孩子,而 6 种方法可以将 1 颗糖果分配给 6 个孩子。我当然在这里做错了什么,但我想不通。

【问题讨论】:

    标签: python itertools combinatorics cartesian-product


    【解决方案1】:

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

    【讨论】:

    • 那么我还必须编辑我的列表理解。它应该是“mylist = [item for item in it.product(range(i+1), repeat = j) if sum(item) == (i-1)]”,对吧?
    • @AzatNuriakhmetov:为什么是sum(item) == (i-1)
    • (另外,为什么不使用closed form?)
    • 谢谢,你帮了大忙
    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 2021-05-18
    • 2021-11-19
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多