7.1 读取和写入文本文件
7.1.1 基础知识
在数据分析的世界里,能够高效地读取和写入文本文件是一项基本技能。Numpy 提供了一些简单易用的工具来处理文本数据。
- 读取文本文件:
np.loadtxt()
和np.genfromtxt()
是 Numpy 中用于从文本文件读取数据的主要函数。loadtxt()
适用于没有缺失数据的情况,而genfromtxt()
则可以处理缺失数据。 - 写入文本文件:
np.savetxt()
函数可以将数组写入文本文件。你可以指定分隔符、头信息、格式等。
7.1.2 完整案例:读取股市数据
假设你有一个股市价格的 CSV 文件,你需要读取这些数据进行分析。
import numpy as np # 假设 'stock_prices.csv' 是一个包含日期和收盘价的文件 # 日期,收盘价 # 2021-01-01,100 # 2021-01-02,101 # ... # 使用 np.loadtxt 读取数据 data = np.loadtxt('stock_prices.csv', delimiter=',', skiprows=1, usecols=1) print("Stock Prices:", data)
在这个案例中,我们使用 np.loadtxt()
从 CSV 文件中读取了股市收盘价,跳过了第一行的标题,并只选取了第二列的数据。
7.1.3 拓展案例 1:处理缺失数据
在现实世界的数据集中,经常会遇到缺失值的情况。我们可以用 np.genfromtxt()
来处理这些数据。
# 假设 'weather_data.csv' 文件中包含了缺失的温度数据 # 日期,温度 # 2021-01-01,23 # 2021-01-02,NaN # ... # 使用 np.genfromtxt 读取数据,并处理缺失值 weather_data = np.genfromtxt('weather_data.csv', delimiter=',', skip_header=1, filling_values=-999) print("Weather Data:", weather_data)
在这个案例中,我们使用 filling_values
参数来处理文件中的 NaN
值,将它们替换为 -999
。
7.1.4 拓展案例 2:写入数据到文本文件
最后,让我们学习如何将数据写回到一个文本文件。
# 假设我们有一些计算结果需要保存 calculated_data = np.array([1.2, 2.3, 3.4, 4.5]) # 使用 np.savetxt 将数据写入文件 np.savetxt('output_data.csv', calculated_data, delimiter=',', header='Calculated Data', comments='') print("Data successfully saved to 'output_data.csv'")
在这个案例中,我们使用 np.savetxt()
将计算后的数据保存到了 CSV 文件中,包括了一个简单的头信息。
掌握如何读取和写入文本文件,你就可以轻松地处理来自各种来源的数据了。无论是分析股市走势还是记录天气变化,Numpy 都将是你在数据旅程中的忠实伙伴。 📈📉📊
7.2 二进制文件操作
7.2.1 基础知识
处理二进制文件是数据分析中的一个重要环节。二进制文件格式通常比文本文件更紧凑,读写速度更快,特别适用于大型数据集。Numpy 提供了简单的方法来保存和加载二进制文件。
- 保存二进制文件:
np.save()
可以将 Numpy 数组保存为.npy
格式的二进制文件。 - 读取二进制文件:
np.load()
用于加载.npy
格式的文件。 - 保存多个数组到一个文件:
np.savez()
或np.savez_compressed()
可以将多个数组保存到一个文件中,后者提供了压缩功能。
7.2.2 完整案例:保存和加载大型数组
假设你正在处理一个非常大的数据集,并希望以二进制格式保存以便快速加载。
import numpy as np # 创建一个大型数组 large_array = np.random.rand(1000, 1000) # 将数组保存为二进制文件 np.save('large_array.npy', large_array) # 加载保存的数组 loaded_array = np.load('large_array.npy') print("Array Loaded Successfully!")
在这个案例中,我们首先创建了一个大型数组,然后使用 np.save()
保存成二进制文件,并通过 np.load()
重新加载。
7.2.3 拓展案例 1:保存和加载多个数组
当你有多个相关数组时,可以将它们保存在一个单独的文件中。
# 创建几个数组 array1 = np.array([1, 2, 3]) array2 = np.array([4, 5, 6]) array3 = np.array([7, 8, 9]) # 保存多个数组到一个文件 np.savez('arrays.npz', array1=array1, array2=array2, array3=array3) # 加载多个数组 loaded_arrays = np.load('arrays.npz') print("Array 1 Loaded:", loaded_arrays['array1']) print("Array 2 Loaded:", loaded_arrays['array2']) print("Array 3 Loaded:", loaded_arrays['array3'])
在这个案例中,我们使用 np.savez()
将三个数组保存在一个 .npz
文件中,并使用 np.load()
加载它们。
7.2.4 拓展案例 2:压缩保存多个数组
对于更大的数据集,使用压缩可以节约存储空间。
# 假设这是两个大型数组 large_array1 = np.random.rand(1000, 1000) large_array2 = np.random.rand(1000, 1000) # 使用压缩功能保存数组 np.savez_compressed('compressed_arrays.npz', large_array1=large_array1, large_array2=large_array2) print("Arrays Compressed and Saved Successfully!")
在这个案例中,我们使用 np.savez_compressed()
将两个大型数组以压缩格式保存,以减少文件大小。
通过使用 Numpy 的二进制文件操作,你可以更有效地处理大型数据集。它们不仅读写速度更快,而且能节省存储空间,是处理大型数据的理想选择。
7.3 使用 HDF5 和其他格式
7.3.1 基础知识
当数据集变得极大或需要高级数据管理时,标准的 Numpy 二进制格式可能不再适用。这时,HDF5(Hierarchical Data Format version 5)等高级格式派上用场。HDF5 是一种多用途的文件格式和复杂数据组织系统,它支持大数据量存储和复杂的数据组织结构。
- HDF5 特点:能够存储和组织大型复杂的数据集合;支持多种数据类型;具备数据压缩、元数据支持等特性;支持部分读写操作,不需要加载整个数据集。
- 访问 HDF5 文件:需要使用专门的库,如
h5py
或PyTables
。
7.3.2 完整案例:使用 HDF5 保存和读取数据
我们将展示如何使用 HDF5
库来保存和读取 HDF5 格式的数据。
import numpy as np import h5py # 创建一些数据 data1 = np.random.rand(1000, 1000) data2 = np.random.rand(1000, 1000) # 创建 HDF5 文件并保存数据 with h5py.File('data.h5', 'w') as f: f.create_dataset('dataset1', data=data1) f.create_dataset('dataset2', data=data2) # 读取 HDF5 文件 with h5py.File('data.h5', 'r') as f: dataset1 = f['dataset1'][:] dataset2 = f['dataset2'][:] print("Data from HDF5 file read successfully!")
在这个案例中,我们首先使用 h5py.File()
创建了一个 HDF5 文件,并创建了两个数据集。然后,我们打开文件并读取这些数据。
7.3.3 拓展案例 1:使用 PyTables 处理大型数据集
PyTables
是另一个处理 HDF5 文件的强大工具,特别适合于大型数据集和高性能操作。
import tables # 使用 PyTables 创建一个 HDF5 文件 with tables.open_file('large_data.h5', mode='w') as f: # 创建一个大型数组并保存 array_size = (10000, 10000) filters = tables.Filters(complevel=5, complib='blosc') data = f.create_carray(f.root, 'data', tables.Float64Atom(), shape=array_size, filters=filters) data[:] = np.random.rand(*array_size) print("Large dataset saved with PyTables!")
这里我们创建了一个非常大的数组并使用 PyTables
保存在 HDF5 文件中,利用了数据压缩功能。
7.3.4 拓展案例 2:使用 HDF5 存储复杂数据结构
HDF5 格式特别适合于存储具有复杂结构的数据,如嵌套的组和表格。
# 创建复杂的数据结构并保存为 HDF5 with h5py.File('complex_data.h5', 'w') as f: group = f.create_group('experiment1') group.create_dataset('data1', data=np.random.rand(100)) group.create_dataset('data2', data=np.random.rand(100)) subgroup = group.create_group('subgroup') subgroup.create_dataset('data3', data=np.random.rand(100)) print("Complex data structure saved in HDF5 file!")
在这个案例中,我们创建了一个包含组和子组的 HDF5 文件,并在其中存储了不同的数据集。
使用 HDF5 和其他高级格式可以大幅提高处理大型和复杂数据集的效率。这些工具使得数据的存储、访问和管理变得更加灵活和高效,是处理现代大数据挑战的关键。