我想从2D事件数组(x,y,t)增加计数器的3D矩阵(nparray) 以下代码有效:
TOF_cube=np.zeros((324,324,4095),np.int32) #initialise a 3d array for whole data set
data = np.fromfile(f, dtype='<i2', count=no_I16) #read all events, x,y,t as 1D array
data=data.reshape(events,cols)
xpos=data[:,0]
ypos=data[:,1]
tpos=data[:,2]
i=0
while i < events:
TOF_cube[xpos[i],ypos[i],tpos[i]] += 1
i+=1
要使用切片和索引,我用
替换while循环 TOF_cube[xpos,ypos,tpos] += 1
但是我没有复制正确的4365520事件(通过while循环并独立检查),而只记录4365197.
为什么切片方法会丢失事件?
我在while循环中使用完全相同的切片,并作为索引的“参数”。
答案 0 :(得分:3)
答案 1 :(得分:-1)
由于我们不确切知道您的数据是什么样的,因此很难猜出实际问题是什么。如果这没有帮助,请举例说明我们可以运行ourselvs(即没有文件f
)。
假设您有x_pos = [1,1,2,3,5]
a = np.zeros(10)
for i in range(len(x_pos)):
a[x_pos[i]]+=1
# gives a = array([ 0., 2., 1., 1., 0., 1., 0., 0., 0., 0.])
然而其他代码
a[x_pos]+=1
# gives a = array([ 0., 1., 1., 1., 0., 1., 0., 0., 0., 0.])
因此,如果其中一个索引出现两次,则只在短版本中更新一次。检查xpos等中是否确实如此。
PS:我做了一个稍微简单的版本,只有一个维度,但规则保持不变。