给定一个numpy数组,是否有一个脚本可以纯粹用python编写,返回其压缩率?
这是一个非常简单、具体的问题,如果不手动使用文件系统,我似乎无法想出一个好的解决方案。
请注意,使用压缩文件本身与此问题无关。答案只需要与压缩比值有关。
由于numPy使用c,我认为纯python解决方案是不可能的,但是您可以使用stringIO避免文件系统。使用 numpy 内置函数np.savez_compression
我们可以将结果大小与 np.savez
进行比较,
import StringIO
def get_compression_ratio(a):
uncompressed = StringIO.StringIO()
compressed = StringIO.StringIO()
np.savez_compressed(compressed, a)
np.savez(uncompressed, a)
return uncompressed.len/float(compressed.len)
a = np.zeros([1000,1000])
a[23,60] = 1.
b = np.random.random([1000,1000])
print("one number = ", get_compression_ratio(a),
"random = ", get_compression_ratio(b))
结果,
('one number = ', 1001.0255255255255, 'random = ', 1.0604228730260878)
由于随机数是不可压缩的,因此这是有道理的,但具有一个非零值的数组应该更好。结果依赖于算法savez_compression
高效/正确。