在不加载多个.npy文件的情况下获得向量的长度

时间:2018-10-19 09:42:42

标签: python file numpy

我大约有2000个.npy文件,每个文件代表一维浮点矢量,其中包含100,000至1,000,000个条目(这些数字将来都会大量增加)。对于每个文件,我都希望它包含的向量的长度。以下选项是可能的,但很耗时:

lengths = [numpy.shape(numpy.load(whatever))[0] for whatever in os.listdir(some_dir)]

问题: 得出向量长度列表的最有效/最快方法是什么?当然,我应该可以直接从filesizes开始工作,但是最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

使用映射的文件将大大加快此过程。 通过映射文件numpy,仅加载标头即可获得数组的形状和数据类型,而实际的数组数据将留在磁盘上,直到需要为止。

import numpy as np 
# Load files using memmap
data = [np.load(f, mmap_mode='r')) for f in os.listdir(some_dir)]
# Checking your assumptions never hurts
assert (d.ndim == 1 for d in data).all()  

lengths = [d.shape[0] for d in data]

编辑,需要加载文件头而不直接使用文件大小的原因是npy文件的头不一定是固定长度。尽管对于没有字段或字段名的一维数组,它可能不会更改(请参见https://www.numpy.org/devdocs/reference/generated/numpy.lib.format.html)。

答案 1 :(得分:1)

您可能可以尝试

import os

fileinfo = os.stats('1darray.npy')

数组长度

a = os.stat('1darray.npy')
int((a.st_size - 128)/itemsize) 

128是将npy文件保存在操作系统的目录中时需要的大小。可以找到任何numpy数组的实际大小(以字节为单位)为array.nbytes。所以a.st_size - 128 = array.nbytesarray.bytes/array.itemsize = array.size = array lenght

如果数组为itemsize = 2位类型,则为float 16;如果类型为浮点4位,则为32;如果数组类型为{{1,则为8 }}位

这里是演示

float 64

所以您必须知道保存的numpy import numpy as np import os array = np.arange(12, dtype=np.float64) print(a.itemsize) # >> gives 8 for float 64 bit np.save('1darray.npy', array) a = os.stat('1darray.npy') length = int((a.st_size - 128)/8) # >> gives 12 which is equal to array.size 文件的dtype是什么

因此,对于您的情况,您可以这样做

npy

假设npy数组的dtype为lengths = [(os.stat(whatever).st_size - 128)/8 for whatever in os.listdir(some_dir)]