【发布时间】:2019-10-22 00:40:50
【问题描述】:
我有 3D 数据量(x、y、z),我想保存 2D 切片(xy、yz、xz 平面)并保存它们以备将来使用。
我尝试这样做的方法是让一个函数 (slice_data) 获取切片,另一个函数 (save_slices) 调用 slice_data,然后使用 numpy.save 保存切片。
如果我不保存切片,则无论我是否提取 xy、yz、xz 平面,获取切片的时间都是相似的。 但是,如果我保存切片,保存切片的时间取决于切片的方向,并且对于 xy、yz、xz 平面是不同的
这是为什么呢?使用我的完整数据,这种差异从几分钟到几小时......
我在下面写了一个虚拟代码,类似于我在完整数据集中用来演示问题的代码。时间差如下图:
不保存,只是切片
mean time x-slice: 0.00011536836624145507 sec
mean time y-slice: 0.00011417627334594726 sec
mean time z-slice: 0.00011371374130249023 sec
切片和保存:
mean time x-slice: 0.04629791975021362 sec
mean time y-slice: 0.06096100091934204 sec
mean time z-slice: 0.08996494293212891 sec
代码:
import os
import numpy as np
import time
import matplotlib.pyplot as plt
# take a slice of the data
def slice_data(roi):
dic = {}
data = np.zeros((512,512,256))
dic['data'] = np.squeeze( data[roi[0]:roi[1]+1, roi[2]:roi[3]+1, roi[4]:roi[5]+1] )
return dic
# save slices if the data
def save_slices(roi, save=False):
var = 'data'
for i in range(0,6):
# iterate to simulate a time series of data
a = slice_data(roi)[var]
var_dir = 'save_test/'
if not os.path.exists(var_dir): os.makedirs(var_dir)
file = var_dir + '{0:04d}{1}'.format(i,'.npy')
if save is True:
np.save(file, a)
## define slices
roix=[256, 256, 0, 512, 0, 256] # yz plane slice
roiy=[0, 512, 256, 256, 0, 256] # xz plane slice
roiz=[0, 512, 0, 512, 128, 128] # xy plane slice
## Calculate slices and do not save the results
dtx = []
dty = []
dtz = []
for i in range(100):
time0 = time.time()
save_slices(roix)
time1 = time.time()
dtx.append(time1-time0)
time0 = time.time()
save_slices(roiy)
time1 = time.time()
dty.append(time1-time0)
time0 = time.time()
save_slices(roiz)
time1 = time.time()
dtz.append(time1-time0)
plt.figure(1)
plt.plot(dtx)
plt.plot(dty)
plt.plot(dtz)
plt.title('time to run code without saving data')
print('mean time x-slice: {} sec'.format(np.mean(dtx)))
print('mean time y-slice: {} sec'.format(np.mean(dty)))
print('mean time z-slice: {} sec'.format(np.mean(dtz)))
## Calculate slices and do save the results
dtx = []
dty = []
dtz = []
for i in range(100):
time0 = time.time()
save_slices(roix, save=True)
time1 = time.time()
dtx.append(time1-time0)
time0 = time.time()
save_slices(roiy, save=True)
time1 = time.time()
dty.append(time1-time0)
time0 = time.time()
save_slices(roiz, save=True)
time1 = time.time()
dtz.append(time1-time0)
plt.figure(2)
plt.plot(dtx)
plt.plot(dty)
plt.plot(dtz)
plt.title('time to run code and save data')
print('mean time x-slice: {} sec'.format(np.mean(dtx)))
print('mean time y-slice: {} sec'.format(np.mean(dty)))
print('mean time z-slice: {} sec'.format(np.mean(dtz)))
【问题讨论】:
-
用更详细的解释更新了我的答案。
-
你能在一个切片后复制一个时间吗?切片生成
view,这是一个具有共享数据缓冲区的新数组(因此无需迭代或复制数据)。np.save会将副本的数据写入文件,而不是源数组的全部数据。