Numpy如何使用另一矩阵的行索引赋值并实现无循环向量化操作?
你之前尝试的weights[:, weight_indexes[:]]会触发numpy的广播机制,行维度的全量切片和形状为(2000,10)的列索引数组广播后,会生成形状为(2000,2000,10)的数组,不符合你逐行取对应列索引的需求。
直接用numpy高级索引就能实现无循环的向量化操作,具体代码如下:
import numpy as np # 构造与weight_indexes形状匹配的行索引数组:形状变为(2000, 1),可以和(2000,10)的列索引广播对齐 row_idx = np.arange(weight_indexes.shape[0])[:, np.newaxis] weights = np.zeros((2000, 2000)) # 逐位置配对行、列索引,直接赋值 weights[row_idx, weight_indexes] = weight_values
这个写法和你原有循环的逻辑完全等价,运行效率远高于Python层级的for循环。
你也可以选择展平索引的写法,效果一致:
weights = np.zeros((2000, 2000)) weights[np.repeat(np.arange(2000), 10), weight_indexes.ravel()] = weight_values.ravel()
内容的提问来源于stack exchange,提问作者morrell53
相关产品推荐
相关产品推荐

