我大约有2000个.npy文件,每个文件代表一维浮点矢量,其中包含100,000至1,000,000个条目(这些数字将来都会大量增加)。对于每个文件,我都希望它包含的向量的长度。以下选项是可能的,但很耗时:
lengths = [numpy.shape(numpy.load(whatever))[0] for whatever in os.listdir(some_dir)]
问题: 得出向量长度列表的最有效/最快方法是什么?当然,我应该可以直接从filesizes开始工作,但是最好的方法是什么?
答案 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.nbytes
和array.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)]