深入探究:Numpy中的npy格式

一、npy格式简介

NumPy是Python中用于科学计算的基础包,提供了数组和矩阵计算的支持,是很多数据处理、机器学习相关库的基础依赖。而npy格式则是NumPy中其自带的数据格式,在存储和加载NumPy数组时使用,具有高效性和通用性。

npy格式本质上是一种二进制文件格式,以.npy作为扩展名,由4部分组成:

1. Magic String: \x93NUMPY\x01\x00
2. Major Version Number: uint8
3. Minor Version Number: uint8
4. Header Length: uint16_bigendian(大端模式)

具体而言,在读取.npy文件时,先读取4字节的魔术字符串,判断其是否为NUMPY,即可确定文件格式是否正确。接下来读取版本号和头部长度,进而可以得到数据的类型、形状等信息。头部长度的值为一个16位大端整数( uint16 ),后续紧跟着的则是一个UTF-8编码的JSON字符串,即 ndarray.dump 函数存储时保存的数组属性信息。

二、npy格式的优势

相较于其他常见的数据格式,npy格式具有下列优点:

1. 快速、高效:npy文件的二进制格式非常紧凑,数据可以直接在内存中复制,即使处理大型数据也能够快速加载。

2. 通用性:npy格式被NumPy Python库原生支持,可以被几乎所有编程语言使用。

3. 可压缩性:npy格式可以被压缩为ZIP格式,这大大减少了文件大小,有时甚至可以达到原始文件大小的10%以下。

三、npy格式的使用实例

1. 创建numpy数组

要创建一个numpy数组,我们可以使用numpy的array()函数,并在其中传递要创建的数组。

import numpy as np
a = np.array([1, 2, 3, 4, 5])
np.save('array.npy', a)

这里,我们创建了一个名为“array.npy”的文件,在其中存储了名为“a”的数组。注意,一定要使用“.npy”扩展名,否则会出现文件格式错误。

2. 读取numpy数组

要读取一个以.npy格式存储的numpy数组,我们可以使用numpy的load()函数。 以下是读取和打印数组的示例:

import numpy as np
a = np.load('array.npy')
print(a)

当然,我们也可以查看这个数组的大小、形状、元素类型等属性:

print(a.dtype)
print(a.shape)
print(a.size)

3. 压缩和解压缩numpy数组

我们可以将.npy文件压缩为ZIP格式,来减少文件大小,也可以将压缩后的文件解压缩为.npy格式,来读取其中存储的numpy数组数据。

以下是通过Python内置的zipfile库将.npy文件压缩为ZIP文件的示例:

import zipfile
zipobj=zipfile.ZipFile("array.zip","w")
zipobj.write("array.npy")
zipobj.close()

以下是将ZIP文件解压缩为.npy格式的示例:

zipobj=zipfile.ZipFile("array.zip","r")
zipobj.extract("array.npy",path="./")
zipobj.close()

arr = np.load("array.npy")
print(arr)

4. 将Python对象保存到numpy数组

我们可以使用numpy的save()函数将Python对象(如列表、字典等)直接存储为.npy格式的文件。

以下是将列表存储为.npy文件的示例:

list_obj = [1, 2, 3, 4, 5]
np.save('list.npy', list_obj)

# 读取
loaded_obj = np.load('list.npy')
print(loaded_obj)

5. 创建结构化数组并存储

我们可以通过定义一个包含每个数据类型的元组列表来创建结构化数组。然后,我们可以使用同样的save()函数将其保存为.npy文件。

以下是创建单个结构化数组并保存为.npy文件的示例:

dt = np.dtype([('name', 'S10'), ('grades', int)])
grades = np.array([('Matt', 90), ('Steve', 85), ('Joy', 87)], dtype=dt)
np.save('grades.npy', grades)

# 读取
data = np.load('grades.npy', allow_pickle=True)
print(data)

6. 多个numpy数组的存储

我们可以使用同样的save()函数一次性存储和读取多个numpy数组。只需将要保存的数组作为参数传递给save()函数即可。

以下是同时保存多个numpy数组的示例:

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = np.array([9, 10, 11, 12])
np.savez('multiple_arrays.npz', a=a, b=b, c=c)

# 读取
data = np.load('multiple_arrays.npz')
print(data['a'])
print(data['b'])
print(data['c'])

总结

npy文件格式是NumPy库中常用的文件格式之一。通过使用npy格式,我们可以方便地存储和读取numpy数组,以及其他Python对象。此外,由于npy格式的高效性和通用性,它也被许多数据处理和机器学习相关库广泛使用。

原创文章,作者:LQJUI,如若转载,请注明出处:https://www.506064.com/n/370505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LQJUILQJUI
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相关推荐

  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • Python矩阵转置函数Numpy

    本文将介绍如何使用Python中的Numpy库实现矩阵转置。 一、Numpy库简介 在介绍矩阵转置之前,我们需要了解一下Numpy库。Numpy是Python语言的计算科学领域的基…

    编程 2025-04-28
  • 如何将视频导出成更小的格式给IT前端文件

    本文将从以下几个方面介绍如何将视频导出成更小的格式,以便于在IT前端文件中使用。 一、选择更小的视频格式 在选择视频格式时,应该尽可能选择更小的格式,如MP4、WebM、FLV等。…

    编程 2025-04-28
  • JavaScript中使用new Date转换为YYYYMMDD格式

    在JavaScript中,我们通常会使用Date对象来表示日期和时间。当我们需要在网站上显示日期时,很多情况下需要将Date对象转换成YYYYMMDD格式的字符串。下面我们来详细了…

    编程 2025-04-27
  • Python列表转numpy数组

    本文将阐述Python中列表如何转换成numpy数组。在科学计算和数据分析领域中,numpy数组扮演着重要的角色。Python与numpy的无缝结合使得数据操作更加方便和高效。因此…

    编程 2025-04-27
  • Python三大:NumPy、Pandas、matplotlib

    本文将详细介绍三大Python数据处理及可视化库——NumPy、Pandas以及matplotlib,为读者提供从基础使用到应用场景的全面掌握。 一、NumPy NumPy是Pyt…

    编程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25

发表回复

登录后才能评论