如何用更符合NumPy风格的高效方法生成元素为一维数组两两最小值的二维数组
如何用更符合NumPy风格的高效方法生成元素为一维数组两两最小值的二维数组
嘿,你的思路没问题,但确实没必要用双重循环——NumPy的向量化操作就是用来解决这种问题的,既简洁又高效,完全是符合NumPy idiom的写法!
给你推荐两种最常用的方法,首选第一种:
方法一:利用广播 + np.minimum
这是最省内存也最快捷的方式,核心是用广播机制让一维数组和它的列向量版本做逐元素的最小值计算:
import numpy as np arr1d = np.array([5, 4, 3, 4, 2, 3]) # 将arr1d转为列向量(6,1),和原行向量(6,)广播为(6,6)的矩阵对 arr2d = np.minimum(arr1d[:, None], arr1d)
解释下:arr1d[:, None]把原来的一维数组变成了一列的二维数组,当它和原一维数组(行方向)进行运算时,NumPy会自动把两者都扩展成(6,6)的二维数组,然后np.minimum会逐个位置取两个对应元素的最小值,全程都是底层优化过的向量化操作,比你写的双重循环快几个数量级,尤其是数组规模大的时候。
方法二:用np.meshgrid生成网格再取最小
如果你更容易理解网格的概念,也可以用meshgrid生成两个和目标二维数组同形状的矩阵,再取最小值:
x, y = np.meshgrid(arr1d, arr1d) arr2d = np.minimum(x, y)
不过这种方法会额外生成两个完整的(6,6)数组,内存占用比第一种方法高,所以如果数组很大的话,优先选第一种。
你可以用np.array_equal(arr2d, 你的循环生成的数组)来验证两种方法的结果完全一致,放心用就行!
备注:内容来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

