gpt4 book ai didi

python - 加快 while 循环匹配数组中的模式

转载 作者:行者123 更新时间:2023-11-28 20:25:01 25 4
gpt4 key购买 nike

我有以下数据数组,有 200 万个条目:

[20965  1239   296   231    -1    -1 20976  1239   299   314   147   337
255 348 -1 -1 20978 1239 136 103 241 154 27 293
-1 -1 20984 1239 39 161 180 184 -1 -1 20990 1239
291 31 405 50 569 357 -1 -1 20997 1239 502 25
176 215 360 281 -1 -1 21004 1239 -1 -1 21010 1239
286 104 248 252 -1 -1 21017 1239 162 38 331 240
368 363 321 412 -1 -1 21024 1239 428 323 -1 -1
21030 1239 -1 -1 21037 1239 325 28 353 102 477 189
366 251 143 452 ... ect

此数组包含 CCD 芯片上光子的 x、y 坐标,我想遍历该数组并将所有这些光子事件添加到一个矩阵中,该矩阵的维度等于 CCD 芯片。

格式如下:number number x0 y0 x1 y1 -1 -1 .两个number我不太关心的条目,x0 y0 等。是我想要出去的。 -1条目是一个指示新帧的分隔符,在这些之后总是有 2 个“数字”条目。

我编写了这段代码,它确实有效:

i = 2
pixels = np.int32(data_height)*np.int32(data_width)
data = np.zeros(pixels).reshape(data_height, data_width)

while i < len(rdata):
x = rdata[i]
y = rdata[i+1]

if x != -1 and y != -1:
data[y,x] = data[y,x] + 1
i = i + 2
elif x == -1 and y == -1:
i = i + 4
else:
print "something is wrong"
print i
print x
print y

rdata是我的原始数组。 data是仅以零开始的结果矩阵。 while 循环从第一个 x 开始坐标,在索引 2 处,然后如果它找到两个连续的 -1 entries 它将跳过四个条目。

脚本工作正常,但运行需要 7 秒。我怎样才能加快这个脚本?我是 python 的初学者,从 最难的 python 学习方法 我知道应该避免 while 循环,但是重写为 for 循环更慢!

for i in range(2, len(rdata), 2):

x = rdata[i]
y = rdata[i+1]

if x != -1 and y != -1:
px = rdata[i-2]
py = rdata[i-1]

if px != -1 and py != -1:
data[y,x] = data[y,x] + 1

也许有人可以想出一个更快的方法,类似于 np.argwhere(rdata == -1)并使用此输出提取 x 的位置和 y坐标?


更新:感谢所有回答!

我使用 askewchan 的方法来保存帧信息,但是,由于我的数据文件有 300000 帧长,所以当我尝试生成维度为 (300000, 640, 480) 的 numpy 数组时出现内存错误。我可以通过创建一个生成器对象来解决这个问题:

def bindata(splits, h, w, data):

f0=0
for i,f in enumerate(splits):
flat_rdata = np.ravel_multi_index(tuple(data[f0:f].T)[::-1], (h, w))
dataslice = np.zeros((w,h), dtype='h')
dataslice = np.bincount(flat_rdata, minlength=pixels).reshape(h, w)
f0 = f
yield dataslice

然后我使用 Gohlke 的 tifffile.py 的修改版本从数组中创建一个 tif从数据生成 tiff 文件。它工作正常,但我需要想出一种方法来压缩数据,因为 tiff 文件大于 4gb(此时脚本崩溃)。我有非常稀疏的数组,640*480 全为零,每帧有十几个,原始数据文件为 4MB,因此应该可以进行一些压缩。

最佳答案

听起来你想要的只是做一些 bool 索引魔术来摆脱无效的帧内容,然后当然是添加像素。

rdata = rdata.reshape(-1, 2)
mask = (rdata != -1).all(1)

# remove every x, y pair that is after a pair with a -1.
mask[1:][mask[:-1] == False] = False
# remove first x, y pair
mask[0] = False

rdata = rdata[mask]

# Now need to use bincount, [::-1], since you use data[y,x]:
flat_rdata = np.ravel_multi_index(tuple(rdata.T)[::-1], (data_height, data_width))

res = np.bincount(flat_rdata, minlength=data_height * data_width)
res = res.reshape(data_height, data_width)

关于python - 加快 while 循环匹配数组中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com