Python中矩阵与数值小于比较的效果及代码疑问解析
关于NumPy中矩阵与数值比较的问题解答
问题1:Python中矩阵(二维数组)与数值执行小于比较会产生什么效果?
在NumPy里,当你对二维数组(矩阵)和单个数值做<这类比较操作时,会触发广播机制——简单来说就是把这个数值“复制”成和矩阵同形状的数组,然后逐个元素进行比较,最终返回一个和原矩阵形状完全一致的布尔型数组,每个位置的元素就是对应位置原矩阵元素与数值比较的结果(True或False)。
问题2:为什么执行矩阵<数值得到布尔值矩阵?我的误解出在哪里?
你这里的核心误解是把元素级别的比较操作当成了按比例筛选元素的操作啦。
你原本想保留数组中80%的元素(12*0.8=9.6,大概10个左右),但np.random.rand(a3.shape[0],a3.shape[1])<keep_prod这行代码的逻辑是:先生成一个和a3同形状的随机数组(元素范围0到1),然后把这个随机数组的每个元素和keep_prod(0.8)做小于比较,最终得到的d3是一个布尔矩阵,它只是标记了随机数组里哪些元素小于0.8,并没有直接从a3里筛选元素。
如果要实现“保留原数组中80%元素”的需求,你可以用这个布尔矩阵d3作为掩码去索引原数组,比如:
filtered_a3 = a3[d3]
这样得到的filtered_a3就是一个一维数组,里面的元素数量大概是原数组的80%(因为随机数组里有80%左右的元素小于0.8)。
再看你的代码和输出:
import numpy as np keep_prod = 0.8 a3 = np.random.rand(3,4) print("a3-before",a3) d3 = np.random.rand(a3.shape[0],a3.shape[1])<keep_prod ##### attention!!! print("d3",d3)
输出:
a3-before [[ 0.6016695 0.733025 0.38694513 0.17916196] [ 0.39412193 0.22803599 0.16931667 0.30190426] [ 0.8822327 0.64064634 0.40085393 0.72317028]] d3 [[False True True False] [ True False True True] [ True True True True]]
这里的d3就是随机数组与0.8比较后的结果,每个True对应随机数组中小于0.8的位置,False则相反。
内容的提问来源于stack exchange,提问作者黄冠斌
相关产品推荐
相关产品推荐

