如何从两个NumPy数组同索引处随机选行并解决np.where广播错误
报错原因
np.where要求输入的条件数组、待选择的两个数组形状可以互相广播。你当前的条件random_selector > .1的形状是(4,),而A、B的形状是(4,2),np.where默认逐元素匹配,一维的条件数组无法直接对应二维数组每行的2个元素,触发广播形状不兼容的报错。
你期望的逻辑是按行选择:只要对应行的条件成立,就整行选A,否则整行选B,所以需要把条件数组扩展为和A、B维度匹配的(4,1)形状,触发numpy的行广播规则即可。
修复方案
两种常用实现方式:
方案1:直接修改np.where的条件维度
import numpy as np A = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) B = np.array([[9, 8], [8, 7], [7, 6], [6, 5]]) random_selector = np.random.random(size=len(A)) # 给条件数组新增最后一个维度,形状从(4,)变为(4,1) C = np.where(random_selector[:, np.newaxis] > .1, A, B)
方案2:掩码索引赋值(可读性更高)
mask = random_selector > 0.1 C = np.empty_like(A) C[mask] = A[mask] C[~mask] = B[~mask]
两种写法都可以实现按行选择的需求,输出符合预期。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

