如何基于条件将Numpy子数组高效添加至Numpy数组?
解决Numpy子数组仅替换大于0元素的高效方法
嗨,这个需求其实用Numpy的向量化操作就能完美解决,完全不用写低效的Python循环,两种常用方法分享给你:
方法一:布尔掩码原地修改
这种方法会直接在原数组上进行修改,适合不需要保留原数组的场景:
import numpy as np original_array = np.array([[2,2],[2,2],[2,2],[2,2]]) sub_array = np.array([[0,0],[1,1],[0,1],[0,0]]) # 创建布尔掩码:标记sub_array中大于0的位置 mask = sub_array > 0 # 仅在掩码为True的位置替换原数组的值 original_array[mask] = sub_array[mask] print(original_array) # 输出: # [[2 2] # [1 1] # [2 1] # [2 2]]
原理很简单:mask是一个和原数组形状相同的布尔数组,original_array[mask]会直接取出所有掩码为True的元素,然后用sub_array[mask]对应位置的值替换,全程是Numpy底层的向量化运算,效率拉满。
方法二:使用np.where生成新数组
如果你不想修改原数组,而是希望得到一个新数组,可以用np.where,一行代码搞定:
import numpy as np original_array = np.array([[2,2],[2,2],[2,2],[2,2]]) sub_array = np.array([[0,0],[1,1],[0,1],[0,0]]) result_array = np.where(sub_array > 0, sub_array, original_array) print(result_array) # 输出和上面完全一致
np.where的逻辑是:第一个参数是条件(这里是sub_array>0),满足条件的位置取第二个参数的值(sub_array),不满足的取第三个参数的值(original_array),非常直观。
两种方法都是Numpy原生的高效操作,不管数组多大,性能都比循环好很多,根据你的需求选就行~
内容的提问来源于stack exchange,提问作者Danii Kilian
相关产品推荐
相关产品推荐

