Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用:Python Numpy切片从二维索引列表(x、y、z)中增加三维计数器数组_Python_Numpy_Indexing_Slice - Fatal编程技术网

使用:Python Numpy切片从二维索引列表(x、y、z)中增加三维计数器数组

使用:Python Numpy切片从二维索引列表(x、y、z)中增加三维计数器数组,python,numpy,indexing,slice,Python,Numpy,Indexing,Slice,我想从事件(x,y,t)的2D数组中增加计数器的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)

我想从事件(x,y,t)的2D数组中增加计数器的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
但我没有复制正确的4365520个事件(通过while循环并独立检查),而是只记录了4365197个

为什么切片方法会丢失事件


我在while循环中使用完全相同的切片,并将其作为索引的“参数”

由于我们不确切知道您的数据是什么样子,因此很难猜测实际问题是什么。如果这没有帮助,请给出一个例子,我们可以运行我们的selvs(即没有文件
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.])
因此,如果其中一个索引出现两次,则在短版本中只更新一次。检查XPO中是否存在这种情况


PS:我做了一个稍微简单的版本,只有一个维度,但规则保持不变。

因为我们不知道您的数据到底是什么样子,所以很难猜测实际的问题是什么。如果这没有帮助,请给出一个例子,我们可以运行我们的selvs(即没有文件
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.])
因此,如果其中一个索引出现两次,则在短版本中只更新一次。检查XPO中是否存在这种情况


PS:我做了一个稍微简单的版本,只有一个维度,但规则保持不变。

+=
如果有重复索引,则不会添加两次

要以矢量化方式获得等效输出,您需要:


如果存在重复索引,
+=
不会添加两次

要以矢量化方式获得等效输出,您需要:


每种方法的
TOF\cube.max()
是什么?每种方法的
TOF\cube.max()
是什么?您已经准确地确定了问题所在,谢谢!通过建议完全修复了
np.add.at(TOF_cube[xpos,ypos,tpos],1)
您已经准确地确定了问题,谢谢!完全修复了建议
np.add.at(TOF_cube[XPO,YPO,TPO],1)
谢谢!这就是问题所在,谢谢!我很惊讶
np.add.at(TOF_cube[xpos,ypos,tpos],1)。
似乎比+=版本运行得慢很多。(我知道我错过了一些活动,但很少)。有人会认为
+=
如果重复,就必须执行
:忽略
检查
np.add
只是循环通过的地方。有什么想法吗?感谢
+=
构造不像
np.add.at
那样是顺序的,它是一个并行(线程化)调用,用于增加一组内存位置。这就是为什么它只能一次增加任何内容(并通过
set
运行位置,以确保没有重复的内容)-否则,当两个线程试图同时增加相同的内存位时,这些单独的线程可能会锁定。另外,不要忘了标记检查答案是否符合您的要求。谢谢!这就是问题所在,谢谢!我很惊讶
np.add.at(TOF_cube[xpos,ypos,tpos],1)。
似乎比+=版本运行得慢很多。(我知道我错过了一些活动,但很少)。有人会认为
+=
如果重复,就必须执行
:忽略
检查
np.add
只是循环通过的地方。有什么想法吗?感谢
+=
构造不像
np.add.at
那样是顺序的,它是一个并行(线程化)调用,用于增加一组内存位置。这就是为什么它只能一次增加任何内容(并通过
set
运行位置以确保没有重复的内容)-否则,当两个线程试图同时增加相同的内存位时,这些单独的线程可能会锁定。另外,不要忘了标记检查答案是否是您正在寻找的。