我有两个numpy数组,定义网格的x和y轴.例如:
x = numpy.array([1,2,3])
y = numpy.array([4,5])
Run Code Online (Sandbox Code Playgroud)
我想生成这些数组的笛卡尔积来生成:
array([[1,4],[2,4],[3,4],[1,5],[2,5],[3,5]])
Run Code Online (Sandbox Code Playgroud)
在某种程度上,由于我需要在循环中多次执行此操作,因此效率不高.我假设将它们转换为Python列表并使用itertools.product并返回到numpy数组并不是最有效的形式.
我有一个合理的大小(压缩后的18GB)HDF5数据集,并希望优化读取行的速度。形状为(639038,10000)。我将多次读取整个数据集中的选定行(例如〜1000行)。所以我不能使用x:(x + 1000)来切片行。
使用h5py从内存不足的HDF5中读取行已经很慢,因为我必须传递一个排序列表并求助于高级索引。有没有一种方法可以避免花式索引,或者我可以使用更好的块形状/大小?
我已经阅读了一些经验法则,例如1MB-10MB的块大小,并且选择了与我所读内容一致的形状。但是,构建大量具有不同块形状的HDF5文件进行测试在计算上非常昂贵且非常缓慢。
对于每个〜1,000行的选择,我立即将它们求和以获得长度10,000的数组。我当前的数据集如下所示:
'10000': {'chunks': (64, 1000),
'compression': 'lzf',
'compression_opts': None,
'dtype': dtype('float32'),
'fillvalue': 0.0,
'maxshape': (None, 10000),
'shape': (639038, 10000),
'shuffle': False,
'size': 2095412704}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的东西:
我正在尝试将瓶颈值保存到新创建的hdf5文件中。瓶颈值成批出现(120,10,10, 2048)。单独保存一个批处理将占用超过16个演出,而python似乎在冻结该批处理。根据最近的发现(请参阅更新,看来hdf5占用大内存是可以的,但是冻结的部分似乎是一个小故障。
我只是想保存前两批用于测试目的,而只保存训练数据集(再一次,这是一次测试运行),但是我什至不能超过第一批。它只会在第一批中停顿,并且不会循环到下一个迭代。如果我尝试检查hdf5,资源管理器将变慢,Python将冻结。如果我尝试杀死Python(即使不检查hdf5文件),Python也无法正确关闭,并且会强制重启。
以下是相关的代码和数据:
总数据点约为90,000 ish,分120个批次发布。
Bottleneck shape is (120,10,10,2048)
Run Code Online (Sandbox Code Playgroud)
所以我要保存的第一批是 (120,10,10,2048)
这是我尝试保存数据集的方式:
with h5py.File(hdf5_path, mode='w') as hdf5:
hdf5.create_dataset("train_bottle", train_shape, np.float32)
hdf5.create_dataset("train_labels", (len(train.filenames), params['bottle_labels']),np.uint8)
hdf5.create_dataset("validation_bottle", validation_shape, np.float32)
hdf5.create_dataset("validation_labels",
(len(valid.filenames),params['bottle_labels']),np.uint8)
#this first part above works fine
current_iteration = 0
print('created_datasets')
for x, y in train:
number_of_examples = len(train.filenames) # number of images
prediction = model.predict(x)
labels = y
print(prediction.shape) # (120,10,10,2048)
print(y.shape) # (120, 12)
print('start',current_iteration*params['batch_size']) # 0
print('end',(current_iteration+1) * params['batch_size']) # 120
hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] …Run Code Online (Sandbox Code Playgroud)