如何无for循环将关联X、Y数组的一维数组转为X-Y索引二维数组?
问题
我拥有一个值数组A、一个X数组和一个Y数组:
import numpy as np A=np.random.rand(100) X=np.linspace(0,9.9,100).astype('int') Y=np.mod(np.linspace(0,99,100).astype('int'),10) from sklearn.utils import shuffle X, Y = shuffle(X, Y, random_state=0)
请问是否存在不使用for循环的快速方法,来构建满足B[X[i],Y[i]]=A[i]的数组B?
解决方案
当然可以,直接利用NumPy的高级索引就能实现无循环的高效赋值,这是NumPy原生的向量化操作,性能远优于for循环。
基础实现(覆盖式赋值)
首先确定数组B的形状:从X和Y的取值范围来看,X的取值是0-9,Y的取值也是0-9,所以B可以初始化为10x10的数组,之后直接用X和Y作为索引完成赋值:
import numpy as np # 初始化B,可根据需求设置初始值,比如全0数组 B = np.zeros((10, 10)) # 向量化赋值,无需循环 B[X, Y] = A
处理重复索引的场景
如果X和Y中存在重复的坐标对(也就是多个i对应同一个(X[i], Y[i])),上面的代码会用最后一个对应的A值覆盖之前的。要是需要对重复位置的值做累加操作,可以使用np.add.at:
B = np.zeros((10, 10)) # 对重复位置的A值进行累加 np.add.at(B, (X, Y), A)
这个操作同样不需要循环,能高效完成累加赋值。
内容的提问来源于stack exchange,提问作者J.A
相关产品推荐
相关产品推荐

