深入探究: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/zh-tw/n/370505.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LQJUI的頭像LQJUI
上一篇 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

發表回復

登錄後才能評論