您的位置:

np.savez:多面手之一的numpy与数据存储

一、基础知识

numpy是一个广泛使用的Python库,用于提供高性能计算和数据分析。而数据存储则是数据处理时的关键部分之一,它涉及到将数据从一种格式转换成另一种格式,以便在处理和分析中使用。在numpy中,np.savez()函数就是一个非常有用的功能,可以有效地用于存储和加载多个numpy数组。该函数将numpy的多个数组保存在单个压缩文件中,并可以在后续工作中轻松地加载和分析这些数组。例如:

import numpy as np 

# 创建numpy数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])

# 将数组保存到“savez.npz”文件中
np.savez('savez.npz', a=a, b=b, c=c)

# 从“savez.npz”文件中加载数组
data = np.load('savez.npz')
print(data['a'])
print(data['b'])
print(data['c'])

这里,我们首先创建了3个numpy数组(a,b和c),然后使用np.savez()函数将它们保存在“savez.npz”文件中,参数a、b和c指定将要保存的数组。稍后,我们使用np.load()函数从文件中加载数组,并将它们存储在一个名为“data”的变量中。最后,我们对每个数组使用print()函数进行打印,以此来查看它们的值。

二、高级应用

np.savez()是一个非常灵活的函数,其可以处理各种不同类型和形状的数组。下面,我们将介绍一些np.savez()函数的高级应用和技巧。

1.将多个数组保存在一个文件中

有时,您需要保存多个不同类型和形状的numpy数组,以便在以后的工作中进行使用。np.savez()函数可以帮助您实现这一点,具体方法是通过在函数中指定多个参数名,在保存数据时将它们一起保存到同一文件中。例如:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([5, 6, 7])
arr3 = np.array(['one', 'two', 'three'])

np.savez('multi_array.npz', a=arr1, b=arr2, c=arr3)

load_array = np.load('multi_array.npz')
print(load_array['a'])
print(load_array['b'])
print(load_array['c'])

在这个示例中,我们创建了一个包含3个不同类型和形状的numpy数组的文件。当我们加载该文件时,在打印每个变量a、b和c时,我们可以看到已成功保存各个数组。

2.压缩存储

np.savez()函数默认使用未压缩的存储格式,但在某些情况下,您可能需要使用更高效的压缩格式。使用numpy.savez_compressed()函数即可实现这一点,例如:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([5, 6, 7])
arr3 = np.array(['one', 'two', 'three'])

np.savez_compressed('multi_array.npz', a=arr1, b=arr2, c=arr3)

load_array = np.load('multi_array.npz')
print(load_array['a'])
print(load_array['b'])
print(load_array['c'])

通过使用np.savez_compressed()函数,我们可以在将numpy数组保存到文件中时使用压缩格式。这使得文件大小更小,而且加载速度更快。

3. 附加数据

在某些情况下,您可能需要将一个或多个numpy数组附加到已有的npz文件中。在这种情况下,np.savez()函数会很有用,您可以先加载文件,然后使用update()将新的数组添加到文件中。例如:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
np.savez('multi_array.npz', a=arr1)

arr2 = np.array([5, 6, 7])
update_array = np.load('multi_array.npz')

update_array.update({'b':arr2})
np.savez('multi_array.npz', **update_array)

load_array = np.load('multi_array.npz')
print(load_array['a'])
print(load_array['b'])

在这个示例中,我们首先使用np.savez()函数将一个numpy数组保存到“multi_array.npz”中。接着,我们创建另一个数组,并在使用np.load()函数加载原始NPZ文件之后调用.update()方法将其附加到该文件中。最后,我们再一次使用np.savez()函数将新文件保存到磁盘上。在打印每个变量时,我们可以看到已成功保存各个数组,而且新的数组也被添加到了文件中。

4. 子文件夹封装

在numpy中,您可以将多个数组存储为单个文件,但如果数组数量很多,有时将它们封装到子文件夹中会更好。您可以通过使用os.mkdir()和os.path.join()函数实现这一目标,例如:

import numpy as np
import os

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.array([7, 8, 9])
 
if not os.path.exists('data'):
    os.makedirs('data')
 
np.savez(os.path.join('data', 'multi_array.npz'), a=arr1, b=arr2, c=arr3)

load_array = np.load(os.path.join('data', 'multi_array.npz'))
print(load_array['a'])
print(load_array['b'])
print(load_array['c'])

在这个示例中,我们使用os模块向npz文件添加子文件夹。在if语句中,我们使用os.makedirs()方法来检查"data"文件夹是否存在。然后,我们使用np.savez()函数将numpy数组保存到名为“multi_array.npz”的(隐式)文件中。加载文件后,我们可以发现已成功保存所有数组。

三、结论

在本文中,我们介绍了NumPy的核心库功能之一即np.savez(),以及一些高级应用和技巧。我们发现,np.savez()是一个非常有用的函数,具有广泛的使用范围,并可以轻松地用于存储和加载numpy数组。np.savez()函数使得数据的存储和处理更加高效,这对数据科学和机器学习的发展有着至关重要的作用。