結構化數據:NumPy 的結構化數組

文章目錄

  • 結構化數據:NumPy 的結構化數組
    • 探索結構化數組的創建
    • 更高級的復合類型
    • 記錄數組:結構化數組的變體
    • 走向 Pandas

結構化數據:NumPy 的結構化數組

結構化數組

雖然我們的數據通常可以用同質數組很好地表示,但有時情況并非如此。本文將演示 NumPy 的結構化數組記錄數組的用法,它們為復合的、異構的數據提供了高效的存儲方式。雖然這里展示的模式適用于簡單操作,但此類場景通常更適合使用 Pandas 的 DataFrame

import numpy as np

假設我們有幾類關于多個人的數據(比如姓名、年齡和體重),并且我們希望將這些值存儲起來以便在 Python 程序中使用。
我們可以將它們分別存儲在三個獨立的數組中:

name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]

但是這樣做有些笨拙,實際使用起來并不方便,因為這里沒有任何內容能表明這三個數組是相關聯的;NumPy 的結構化數組允許我們通過使用單一結構來更自然地存儲所有這些數據。

回想一下,之前我們使用如下表達式創建了一個簡單的數組:

x = np.zeros(4, dtype=int)

我們同樣可以使用復合數據類型規范來創建結構化數組:

# 使用復合數據類型創建結構化數組
data = np.zeros(4, dtype={'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})
print(data.dtype)
[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')]

這里的 'U10' 表示“最大長度為 10 的 Unicode 字符串”,'i4' 表示“4 字節(即 32 位)整數”,而 'f8' 表示“8 字節(即 64 位)浮點數”。
我們將在下一節討論這些類型代碼的其他選項。

現在我們已經創建了一個空的容器數組,可以用我們的值列表來填充這個數組了:

data['name'] = name
data['age'] = age
data['weight'] = weight
print(data)
[('Alice', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 37, 68. )('Doug', 19, 61.5)]

如我們所愿,數據現在已經方便地排列在一個結構化數組中。

結構化數組的一個便利之處在于,我們現在既可以通過索引,也可以通過字段名來引用數值:

# 獲取所有姓名
data['name']
array(['Alice', 'Bob', 'Cathy', 'Doug'], dtype='<U10')
# 獲取第一行數據
data[0]
np.void(('Alice', 25, 55.0), dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
# 獲取最后一行的姓名
data[-1]['name']
np.str_('Doug')

通過布爾掩碼,我們甚至可以進行更復雜的操作,比如根據年齡進行篩選:

# 獲取小于30歲人員的姓名
data[data['age'] < 30]['name']
array(['Alice', 'Doug'], dtype='<U10')

如果你想進行比這些更復雜的操作,建議你考慮使用 Pandas 包。
正如你將看到的,Pandas 提供了一個 DataFrame 對象,這是一種基于 NumPy 數組構建的數據結構,提供了多種有用的數據操作功能,類似于你在這里看到的內容,而且功能遠不止這些。

探索結構化數組的創建

結構化數組的數據類型可以通過多種方式指定。
前面我們已經看到了字典的方法:

np.dtype({'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})
dtype([('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

為清晰起見,數值類型也可以使用 Python 類型或 NumPy 的 dtype 來指定:

np.dtype({'names':('name', 'age', 'weight'),'formats':((np.str_, 10), int, np.float32)})
dtype([('name', '<U10'), ('age', '<i8'), ('weight', '<f4')])

復合類型也可以用元組列表的形式指定:

np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
dtype([('name', 'S10'), ('age', '<i4'), ('weight', '<f8')])

如果你不關心類型的名稱,也可以僅用逗號分隔的字符串來指定類型:

np.dtype('S10,i4,f8')
dtype([('f0', 'S10'), ('f1', '<i4'), ('f2', '<f8')])

縮寫的字符串格式代碼可能一開始不太直觀,但它們基于簡單的原則。
第一個(可選)字符 <>,分別表示“小端序”或“大端序”,用于指定有效位的排序方式。
下一個字符指定數據的類型:字符、字節、整數、浮點數等(見下表)。
最后一個或多個字符表示對象的字節大小。

字符描述示例
'b'字節np.dtype('b')
'i'有符號整數np.dtype('i4') == np.int32
'u'無符號整數np.dtype('u1') == np.uint8
'f'浮點數np.dtype('f8') == np.int64
'c'復數浮點數np.dtype('c16') == np.complex128
'S', 'a'字符串np.dtype('S5')
'U'Unicode 字符串np.dtype('U') == np.str_
'V'原始數據(void)np.dtype('V') == np.void

更高級的復合類型

可以定義更高級的復合類型。例如,你可以創建一種類型,其中每個元素包含一個數組或矩陣的值。
下面,我們將創建一個數據類型,其中包含一個 mat 字段,該字段是一個 3 × 3 3\times 3 3×3 的浮點型矩陣:

tp = np.dtype([('id', 'i8'), ('mat', 'f8', (3, 3))])
X = np.zeros(1, dtype=tp)
print(X[0])
print(X['mat'][0])
(0, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]

現在,X 數組中的每個元素都包含一個 id 和一個 3 × 3 3\times 3 3×3 的矩陣。
為什么要使用這種方式,而不是簡單的多維數組,或者 Python 字典呢?
其中一個原因是,這種 NumPy 的 dtype 可以直接映射到 C 語言的結構體定義,因此包含數組內容的緩沖區可以被適當編寫的 C 程序直接訪問。
如果你需要為操作結構化數據的遺留 C 或 Fortran 庫編寫 Python 接口,結構化數組可以提供強大的接口能力。

記錄數組:結構化數組的變體

NumPy 還提供了記錄數組(np.recarray 類的實例),它們與前面介紹的結構化數組幾乎完全相同,但有一個額外的特性:字段可以作為屬性訪問,而不僅僅是作為字典鍵訪問。
回想一下,我們之前通過如下方式訪問示例數據集中的年齡字段:

data['age']
array([25, 45, 37, 19], dtype=int32)

如果我們將數據視為記錄數組(record array),就可以用更簡潔的方式訪問字段:

data_rec = data.view(np.recarray)
data_rec.age
array([25, 45, 37, 19], dtype=int32)

缺點是,對于記錄數組,即使使用相同的語法,訪問字段時也會有一些額外的開銷:

%timeit data['age']
%timeit data_rec['age']
%timeit data_rec.age
34 ns ± 0.458 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
481 ns ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
975 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

這種更方便的記法是否值得(略微的)額外開銷,將取決于你的具體應用場景。

走向 Pandas

本文關于結構化數組和記錄數組的內容之所以安排在本部分的結尾,是因為它很好地引出了我們接下來要介紹的包:Pandas。
結構化數組在某些場景下非常有用,比如你需要用 NumPy 數組映射到 C、Fortran 或其他語言中的二進制數據格式時。
但在日常的結構化數據處理中,Pandas 包無疑是更好的選擇;在接下來的章節中,我們將深入探討它。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86621.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

phpcms 更換新域名更新欄目url和內容頁url無法更新解決方法

更換域名后更新欄目url和內容頁url還是無法更新為新的域名&#xff0c;手動把cache文件夾下能清除的緩存文件清除了還是不行&#xff0c;把數據庫的緩存表內容清空了還是不行&#xff0c;問題在于欄目緩存并沒有清除。 解決辦法: (1)、找到文件&#xff1a;/caches/configs/sys…

瑪哈特七輥矯平機:板材平整的精密衛士

在金屬板材加工領域&#xff0c;表面平整度是衡量產品質量的核心指標之一。無論是汽車覆蓋件、精密儀器外殼&#xff0c;還是建筑裝飾板材&#xff0c;任何彎曲、波浪或翹曲都將嚴重影響后續加工精度、產品強度及美觀度。七輥矯平機&#xff0c;憑借其獨特的輥系結構設計&#…

融合聚類與分類的退役鋰電智能分選技術:助力新能源汽車產業可持續發展

融合聚類與分類的退役鋰電智能分選技術&#xff1a;助力新能源汽車產業可持續發展 關鍵詞&#xff1a;退役鋰離子電池分選 | 聚類分類融合 | 電化學阻抗譜(EIS) | 動態時間規整(DTW) | 多模態分類模型 新能源汽車 | 電池梯次利用 | 增量學習 | 數字孿生 | 聯邦學習 | 雙流特征…

jenkins中執行python腳本導入路徑錯誤

&#x1f9fe; 問題一&#xff1a;ModuleNotFoundError: No module named jenkins &#x1f50d; 現象&#xff1a; 在本地運行正常&#xff0c;但在 Jenkins 中運行腳本時報錯&#xff0c;提示找不到 jenkins 模塊。 ? 原因分析&#xff1a; Python 默認只從當前目錄或已…

華為云Flexus+DeepSeek征文 | 華為云ModelArts Studio實戰指南:創建高效的AingDesk知識庫問答助手

華為云FlexusDeepSeek征文 | 華為云ModelArts Studio實戰指南&#xff1a;創建高效的AingDesk知識庫問答助手 前言一、ModelArts Studio介紹1. 華為云ModelArts Studio簡介2. 華為云ModelArts Studio主要特點3. 華為云ModelArts Studio主要使用場景 二、AingDesk介紹1. AingDes…

NLP基礎1_word-embedding

基于github項目&#xff1a;https://github.com/shibing624/nlp-tutorial/tree/main 自然語言處理任務 1) 簡單任務 拼寫檢查 Spell Checking 關鍵詞檢索 Keyword Search 同義詞查找 Finding Synonyms 2) 中級任務 解析來自網站、文檔等的信息 3) 復雜任務 機器翻譯 Ma…

ClickHouse系列--BalancedClickhouseDataSource實現

clickhouse-jdbc中負載均衡數據源的實現。 基本邏輯如下&#xff1a; 1.通過配置的url串&#xff0c;來切分構造url列表&#xff1b; 2.通過一個定時線程任務&#xff0c;來不斷的去ping url列表&#xff0c;來更新可用的url列表&#xff1b; 3.在可用列表中隨機返回一個可用ur…

Linux目錄說明

Linux Filesystem Hierarchy Standard&#xff08;FHS&#xff09; 1. /bin 全稱&#xff1a;Binary&#xff08;二進制文件&#xff09;功能&#xff1a;存放系統最基礎的可執行命令&#xff0c;所有用戶&#xff08;包括普通用戶&#xff09;都能使用&#xff0c;用于系統啟…

鴻蒙 Grid 與 GridItem 深度解析:二維網格布局解決方案

一、引言&#xff1a;網格布局 —— 多維度數據展示的黃金方案 在鴻蒙應用開發體系中&#xff0c;網格布局作為處理多元素有序排列的核心方案&#xff0c;廣泛應用于電商商品陳列、圖片畫廊、功能矩陣等場景。鴻蒙提供的 Grid 與 GridItem 組件通過聲明式語法構建靈活的二維布…

??Vue 開發環境配置:使用 devServer.proxy 解決跨域問題?-vue中文件vue.config,js中配置devserver做反向代理到后端

??Vue 開發環境配置&#xff1a;使用 devServer.proxy 解決跨域問題?? ??引言?? 在現代 Web 開發中&#xff0c;前端和后端通常獨立開發&#xff0c;前端運行在 http://localhost:8080&#xff0c;而后端可能運行在 http://localhost:8000 或其他端口。由于瀏覽器的 …

JVM 中的 GC 算法演進之路!(Serial、CMS、G1 到 ZGC)

引言 想象一下&#xff0c;Java 程序運行就像在一個巨大的圖書館里借書還書。這個圖書館&#xff08;JVM 的內存堆區&#xff09;為了高效運轉&#xff0c;需要一個聰明的“圖書管理員”來清理失效的書籍&#xff08;垃圾對象&#xff09;。這&#xff0c;就是垃圾回收器&#…

(9)python+playwright自動化測試-頁面(page)

1.簡介 通過前邊的講解和學習&#xff0c;細心認真地你可能發現在Playwright中&#xff0c;沒有Element這個概念&#xff0c;只有Page的概念&#xff0c;Page不僅僅指的是某個頁面&#xff0c;例如頁面間的跳轉等&#xff0c;還包含了所有元素、事件的概念&#xff0c;所以我們…

《自動控制原理 》- 第 1 章 自動控制的基本原理與方式

1-1 自動控制的基本原理與方式 自動控制是指在沒有人直接參與的情況下&#xff0c;利用外加的設備或裝置&#xff0c;使機器、設備或生產過程的某個工作狀態或參數按照預定的規律運行。自動控制的核心原理是反饋控制&#xff0c;即通過將系統的輸出量回送到輸入端&#xff0c;與…

DL00715-基于YOLOv11的水面漂浮物目標檢測含數據集

【論文必備】基于YOLOv11的水面漂浮物目標檢測——讓你的研究走在科技前沿&#xff01; 在環境監測、海洋保護和水質管理領域&#xff0c;水面漂浮物的檢測一直是一個亟待解決的難題。傳統的人工巡檢方式不僅耗時費力&#xff0c;還無法覆蓋廣泛的水域范圍。如今&#xff0c;基…

權電阻網絡DAC實現電壓輸出型數模轉換Multisim電路仿真——硬件工程師筆記

目錄 1 基礎知識 1.1 運算放大器在DAC中的作用 1.2 常見的基于運算放大器的DAC電路 1.2.1 倒T形電阻網絡DAC 1.2.2 權電阻網絡DAC 1.2.3 開關電容DAC 1.3 運算放大器的選擇 1.4 設計注意事項 2 仿真實驗 2.1 權電阻網絡DAC實現數字0對應電壓輸出 2.2 權電阻網絡DAC實…

Redis主從集群

? 一、什么是 Redis 主從集群&#xff1f; Redis 主從&#xff08;Master-Slave&#xff09;集群是一種最基礎的集群方式&#xff1a; 一臺 Redis 作為主節點&#xff08;Master&#xff09;&#xff0c;負責寫操作&#xff1b; 一到多臺 Redis 作為從節點&#xff08;Slave&…

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間 寫在最前面**為什么“token序列空間”有根本缺陷&#xff1f;****為什么“語義向量空間”能破局&#xff1f;****1. 連續性&#xff08;抗攻擊的核心&#xff09;****2. 高維復雜性&#xff08;防破解…

Glide緩存機制

一、緩存層級與設計目標 雙級緩存&#xff1a; 內存緩存&#xff1a;弱引用 LruCache 磁盤緩存&#xff1a;DiskLruCache 設計目標&#xff1a; 減少網絡流量消耗 避免Bitmap頻繁創建/銷毀引發的GC 提升圖片加載速度 二、內存緩存機制 1. 雙緩存結構 緩存類型存儲對象…

BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件

文章目錄 ?? BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件? 功能特點?? 插件架構核心模塊文件結構?? 安裝方法方法一:手動安裝方法二:Git克隆?? 配置說明站點地圖基本設置搜索引擎配置百度搜索引擎必應(Bing)搜索引擎谷歌(Google)搜索引擎?? 使用…

androidx中<layout>根布局的意義及用法

在 Android 開發中,<layout> 根布局是 Android Jetpack Data Binding 庫的核心組件,用于聲明該 XML 布局文件將使用數據綁定功能。以下是詳細說明: ?? 一、基本作用 1. 啟用數據綁定 <layout> 標簽標志著此布局文件支持數據綁定,編譯器會為其生成對應的綁定類…