NumPy用索引数组给(10000,2)数组对应行赋值报错如何解决
问题根源
你调用np.argwhere得到的indl是形状为(Nl, 1)的二维数组,每一行存储一个满足条件的索引值,而非索引数组所需的一维整数序列。用该二维数组索引x的行维度时,会额外引入维度,导致索引结果的形状和生成的多元正态分布数组形状不匹配,触发广播错误。
解决方法
方法1:修改indl的生成逻辑,直接得到一维索引数组
将indl的生成代码改为以下任意一种即可:
# 方法1.1 对argwhere结果降维 indl = np.argwhere(u <= thresholds[l]).flatten() # 方法1.2 直接用flatnonzero生成一维索引 indl = np.flatnonzero(u <= thresholds[l])
修改后原有赋值代码x[indl,:] = rng.multivariate_normal(meanVectors[l,:], covMatrices[l,:,:], Nl)可直接正常运行。
方法2:索引时主动提取有效维度
如果不想修改indl的生成逻辑,也可以在赋值时直接取indl的第一列作为行索引:
x[indl[:,0],:] = rng.multivariate_normal(meanVectors[l,:], covMatrices[l,:,:], Nl)
额外校验项
可先打印x.shape确认数组形状确实为(10000, 2),避免x = np.zeros((n,N)).transpose()中n和N的参数顺序写反导致的额外形状问题。
内容的提问来源于stack exchange,提问作者Jonathan Sullivan
相关产品推荐
相关产品推荐

