我有一个2dim数据库作为numpy.array(时间,字段值)。其次,我有一个元组的np.array,包含相同顺序的字段坐标。我现在要做的是重塑数据库,以便稍后我可以使用matplotlib.imshow()查看地图。 问题是,字段值不是定期分布的,也不是由函数分布的。只有这个密钥列表。
C方式只是运行一个循环。给出了该字段的最大尺寸。
#generating minimal dataset
data=np.random.rand(5,10)
keys=[]
maxdimx=5
maxdimy=5
for i in range(0,10):
keys.append((np.random.random_integers(0,maxdimx-1),np.random.random_integers(0,maxdimy-1)))
#here just random keys are used, normaly there is a check for double entries
#horrible C-Style solution
def map_data(dimx,dimy,data,keys):
maxt=data.shape[0]
maped=np.zeros((maxt,maxdimx,maxdimy))
for t in range(0,maxt):
for i in range(0,len(keys)):
maped[t,keys[i][0],keys[i][1]]=data[t,i]
return maped
然而,对于大地图和更长的时间序列来说,这需要花费很长时间。 有没有办法把它放在矢量化函数中? 有没有numpy功能可以做到这一点?或者一些疯狂的索引? 由于每个时间点的排序是相同的,我认为可能存在这种可能性。
提前谢谢大家!
答案 0 :(得分:2)
你问了!这是&em> crazy indexing
又名advanced-indexing
的方法 -
k = np.asarray(keys)
out = np.zeros((maxt,maxdimx,maxdimy))
out[np.arange(maxt)[:,None],k[:,0],k[:,1]] = data