一句话:笛卡尔积把多个集合的元素两两配对,生成全部有序组合—— 的元素是有序对 ,总数是 。
数学定义
两个集合 、 的笛卡尔积(Cartesian product)定义为:
经典例子是 :整个二维平面,每个点就是一对实数坐标。名字也来自这里——Descartes 用坐标系把几何问题代数化,这个”全量配对”运算后来以他命名。
基数按乘法增长:。3 个字母配 4 个数字,得到 12 个有序对。这个乘法增长是它在组合计数中的地位来源,也是网格搜索、CROSS JOIN 这类工程场景的代价来源,见 排列组合。
注意 是有序对:。所以 一般不等于 ,除非 或其中一边为空集。交换律在这里失效,是初学者最容易忽略的一点。
多个集合与运算性质
有限个集合连乘没有歧义,元素是 n 元组:
对并和交满足分配律:
结合律只在不严格的意义下成立: 的元素形如 ,和 并不相同,但两者与 之间都存在自然双射——工程语境下通常不加区分。
若任一因子为空集,整个积为空集:。这与乘法里的”乘以零”完全同构。
编程里的笛卡尔积
Python 的 itertools.product 把嵌套循环压成一层 for,repeat 参数处理同一集合的自我连乘:
from itertools import product
list(product('AB', '12')) # [('A','1'), ('A','2'), ('B','1'), ('B','2')]
list(product('AB', repeat=2)) # 自我连乘,长度 2^2 = 4SQL 中两张表不带连接条件的 CROSS JOIN 就是笛卡尔积,行数等于左表行数乘右表行数——忘写 WHERE 时那张爆炸的结果表,就是 增长的直观体验。更多用法见 itertools。
深度学习里的场景更隐蔽:网格搜索超参空间 product(lr, batch_size, depth)、batch 索引与时间步的全组合、多-label 任务的候选对齐,本质上都在构造笛卡尔积。