Python中多维数组匹配与非匹配值的评估及赋值问题
嘿,这个需求其实很适合用NumPy的矢量化操作来高效解决,不用手动写循环~ 我来给你拆解一下怎么做:
准备工作
首先确保你已经导入了NumPy,然后定义好你的两个数组:
import numpy as np array_1 = np.array([[1,2,2], [1,2,3],[1,2,1]]) array_2 = np.array([[1,1,2], [2,2,3],[3,1,1]])
方法1:使用
np.select(矢量化,高效) 这种方法适合规则较多的场景,完全用NumPy的矢量化逻辑处理,性能拉满。你只需要把所有判断条件和对应的赋值列出来就行:
# 定义所有判断条件 conditions = [ # array_1和array_2对应位置相同的情况(赋值0) (array_1 == 1) & (array_2 == 1), (array_1 == 2) & (array_2 == 2), (array_1 == 3) & (array_2 == 3), # array_1=1,array_2不同的情况 (array_1 == 1) & (array_2 == 2), (array_1 == 1) & (array_2 == 3), # array_1=2,array_2不同的情况(这里我假设了规则,你可以根据实际需求修改) (array_1 == 2) & (array_2 == 1), (array_1 == 2) & (array_2 == 3), # array_1=3,array_2不同的情况(同样,按需修改) (array_1 == 3) & (array_2 == 1), (array_1 == 3) & (array_2 == 2), ] # 对应每个条件的赋值结果 values = [ 0, 0, 0, # 相同元素赋值0 10, 15, # array_1=1时的不同情况赋值 5, 20, # array_1=2时的不同情况赋值 25, 30 # array_1=3时的不同情况赋值 ] # 生成结果数组 result = np.select(conditions, values) print(result)
运行后得到的结果是:
[[ 0 5 0] [10 0 0] [15 5 0]]
方法2:使用字典映射(直观易维护)
如果你觉得条件列表太繁琐,用字典来存规则会更清晰,一看就知道每个( array_1值, array_2值 )对应什么结果:
# 定义规则字典,键是(array_1元素, array_2元素),值是要赋的结果 rule_map = { (1,1): 0, (1,2):10, (1,3):15, (2,1): 5, (2,2):0, (2,3):20, (3,1):25, (3,2):30, (3,3):0 } # 把两个数组扁平化后配对成元组,再用字典映射,最后恢复原形状 flatten_pairs = list(zip(array_1.flatten(), array_2.flatten())) result = np.array([rule_map[pair] for pair in flatten_pairs]).reshape(array_1.shape) print(result)
这个方法得到的结果和上面完全一样,优点是规则修改起来特别方便,直接改字典就行。
注意事项
- 如果你的数组元素不止1、2、3,记得把所有可能的配对都加到规则里,避免KeyError;
- 要是追求极致性能,优先选
np.select,因为字典映射本质是Python循环,对于超大数组来说速度会慢一些; - 相同元素的规则可以统一写,但分开列在条件里更清晰,也方便你后续调整。
内容的提问来源于stack exchange,提问作者Destaneon
相关产品推荐
相关产品推荐

