如何使用Numpy专用函数从两个数组生成全配对子数组
用Numpy实现数组元素的全组合映射(无循环)
这问题我太熟了!要生成两个数组元素的全配对子数组,完全不用写for循环,用Numpy内置的广播机制或者专用函数就能高效搞定,下面给你两种实用的方法:
方法一:兼容所有Numpy版本的np.meshgrid方案
这是最通用的实现方式,不管你用的是哪个版本的Numpy都能跑:
import numpy as np # 定义输入数组 array1 = np.array([6, 8, 9]) array2 = np.array([1, 2, 3]) # 生成网格矩阵,indexing='ij'保证元素顺序和示例一致 x, y = np.meshgrid(array1, array2, indexing='ij') # 将网格展平后合并成目标数组 result = np.column_stack((x.ravel(), y.ravel()))
运行后result就是你要的结果:
array([[6, 1], [6, 2], [6, 3], [8, 1], [8, 2], [8, 3], [9, 1], [9, 2], [9, 3]])
原理说明
np.meshgrid(array1, array2, indexing='ij')会生成两个二维数组:x的每一行都是array1的完整元素,y的每一列都是array2的完整元素,刚好对应所有配对组合。ravel()把二维数组展平成一维,column_stack则把两个一维数组合并成二维的子数组结构。
方法二:Numpy 1.25+ 专属的便捷函数np.cartesian_product
如果你用的是Numpy 1.25及以上版本,直接用笛卡尔积函数一行就能搞定,代码更简洁:
import numpy as np array1 = np.array([6, 8, 9]) array2 = np.array([1, 2, 3]) # 直接生成两个数组的笛卡尔积 result = np.array(np.cartesian_product(array1, array2))
这个函数会直接返回两个输入数组的所有元素配对,顺序和示例完全一致,不用额外处理形状。
内容的提问来源于stack exchange,提问作者Guardian
相关产品推荐
相关产品推荐

