Cartesian Product in Python
定义
笛卡尔乘积(Cartesian product)定义,两个集合$X$和$Y$的笛卡尔积$X\times Y$为第一个对象是$X$的成员而第二个对象是$Y$的成员的所有有序对所组成的集合,如:
$$
\begin{align*}
A\space=&\space\space\left\{a,b\right\}\\
B\space=&\space\space\left\{0,1\right\}\\
A\times B\space=&\left\{(a,0),(a,1),(b,0),(b,1)\right\}
\end{align*}
$$
笛卡尔积也可以扩展为$n$个集合。
实例
Python中有很多能产生笛卡尔积的库函数,它们在与有序对相关的运算中很有用,如GNN中的邻接矩阵等,一些常见的有:
product
1 | from itertools import product |
product
接受$n$个可迭代对象,并生成它们的笛卡尔积,生成的笛卡尔积也是个可迭代对象,其每个元素是一个元组,代表一个有序对,可以用list
将其转化为列表,如:
1 | 1, 2, 3] a = [ |
repeat
代表将前面的可迭代对象重复的次数。如,product(a, b, a, b)
等价于product(a, b, repeat=2)
:
1 | 1] a = [ |
np.ix_
1 | import numpy as np |
*args
是两个及以上的一维数组,这些数组的数据类型要么是整型int
,要么是布尔型bool
。np.ix_
会返回一个元组,元组的每个元素是一个$n$维的矩阵(取决于输入数组的个数,如果输入两个数组,那么就是$2$维的矩阵),这些元素通过广播机制(broadcasting)生成笛卡尔积。因为这个元组实际上没什么用,所以np.ix_
总是被用来进行切片操作:
1 | 1, 5, 7, 2] a = [ |
其中,最后的x[np.ix_([1,5,7,2],[0,3,1,2])]
使得x
被切片出对应下标的元素,如[1, 0]
切出4
,[1, 3]
切出7
,最后的[2, 2]
切出10
。当输入np.ix_
的数组的元素类型为bool
时,这些数组会被先转化为其True
元素的下标所形成的数组,即先进行一次np.nonzero(boolean_sequence)
,所以下面这两种切片是等价的:
1 | print(x[np.ix_([False, True, True],[True, True, True, True])]) |