【numpy基礎】--數組索引

来源:https://www.cnblogs.com/wang_yb/archive/2023/07/02/17520930.html
-Advertisement-
Play Games

數組索引是指在`numpy`數組中引用特定元素的方法。`numpy`的數組索引又稱為`fancy indexing`,比其他編程語言的索引強大很多。 # 1. 選取數據 numpy的索引除了像其他語言一樣選擇一個元素,還可以間隔著選取多個元素,也可以用任意的順序選取元素。 比如一維數組: ```py ...


數組索引是指在numpy數組中引用特定元素的方法。
numpy的數組索引又稱為fancy indexing,比其他編程語言的索引強大很多。

1. 選取數據

numpy的索引除了像其他語言一樣選擇一個元素,還可以間隔著選取多個元素,也可以用任意的順序選取元素。

比如一維數組:

arr = np.random.randint(0, 10, 5)
print(arr)
#運行結果
[7 2 6 2 1]

indexes = [0, 2, 3]
print(arr[indexes])
#運行結果
[7 6 2]

indexes = [4, 0, 2]
print(arr[indexes])
#運行結果
[1 7 6]

從上面的示例看出,通過傳入 indexes 數組,可以一次選擇多個元素。
indexes 數組中的值代表數組arr的下標,從0開始。

對於二維數組:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#運行結果
[[5 7 3 3 2]
 [2 5 6 3 6]
 [4 1 1 0 1]
 [6 5 8 9 1]
 [2 6 5 2 0]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

print(arr[rows, cols])
#運行結果
[9 2 6]

這裡 rowscols 分別代表行和列的索引,從0開始。
運行結果選取的是單個元素,分別是:arr[3, 3]arr[1, 0]arr[4, 1]

如果要從二維數組中通過選取行列,而不是選取單個元素的話:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#運行結果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

arr[rows[:, np.newaxis], cols]
#運行結果
[[6 8 9]
 [1 1 8]
 [5 5 4]]

arr[rows[:, np.newaxis], cols] 是先選取3,1,4 行,得到:

[[8 9 1 6 9]
[1 8 8 1 9]
[5 4 3 5 6]]

然後選取3,0,1 列,得到:

[[6 8 9]
[1 1 8]
[5 5 4]]

2. 與切片結合

fancy indexing可以和之前數組的切片操作相結合:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#運行結果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

#切片在行上
print(arr[:2, cols])
#運行結果
[[6 4 2]
 [1 1 8]]

#切片在列上
print(arr[rows, 1:])
#運行結果
[[9 1 6 9]
 [8 8 1 9]
 [4 3 5 6]]

arr[:2, cols] 先選擇前2行,然後按照 cols 順序選擇列。
arr[rows, 1:] 按照 rows 順序選擇行,然後選擇後4列。

3. 與掩碼結合

fancy indexing也可以和之前介紹的掩碼相結合來過濾數組:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#運行結果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
mask = np.array([True, False, False, False, True])

print(arr[rows[:, np.newaxis], mask])
#運行結果
[[8 9]
 [1 9]
 [5 6]]

arr[rows[:, np.newaxis], mask] 先按照 rows 的順序選擇行,然後用mask過濾掉 False 的列。
最後剩下的是 3,1,4 行的 第一列**最後一列**

4. 修改數據

最後,fancy indexing還有個重要的作用是修改數據,我們通過fancy indexing選取數據之後,可以直接修改它們。

arr = np.random.randint(0, 10, (5,5))
print(arr)
#運行結果
[[6 4 7 8 1]
 [0 3 5 0 6]
 [8 9 4 7 0]
 [3 0 0 9 1]
 [4 5 5 0 5]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

arr[rows, cols] = [100] * len(arr[rows, cols])
print(arr)
#運行結果
[[  6   4   7   8   1]
 [100   3   5   0   6]
 [  8   9   4   7   0]
 [  3   0   0 100   1]
 [  4 100   5   0   5]]

上面的示例中,將fancy indexing選取出的值修改為100。
註意[100] * len(arr[rows, cols]) 這個代碼是根據fancy indexing選取出的元素個數來決定將幾個值修改成100

5. 總結回顧

numpy數組索引的意義在於它可以使數組中的數據更加靈活和易於管理。
通過使用索引,開發人員可以快速訪問數組中的特定元素,而不需要遍歷整個數組。
這可以大大加快計算速度和減少記憶體使用。

此外,數組索引還可以用於數組的重構和維護。
通過對數組索引的有效使用,開發人員可以輕鬆地修改和維護數組中的數據,而不會影響到其他使用該數組的程式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > [MaterialSkin.2](https://www.nuget.org/packages/MaterialSkin.2 "MaterialSkin.2") 控制項包是在 [MaterialSkin](https://github.com/IgnaceMaes/MaterialSkin "Ma ...
  • # Linux grep、sed、awk(包含練習題) ## 一、grep Linux grep (global regular expression) 命令用於查找文件里符合條件的字元串或正則表達式。 1. 基本用法與常見的正則表達式 > ``` > grep [options] pattern ...
  • 前幾天說明瞭Windows Powershell的使用方法,本來以為這就是適合自己的小工具了,沒想到狠狠打了自己的臉,不能夠顯示圖形化界面。(pavucontrol命令會顯示圖形化音量設置選項) 而且在網上沒找到相應的解決辦法,有知道的大佬們可以在評論區指個路子,萬分感謝。 自己沒有辦法,於是就從以 ...
  • Oracle能夠讓你在無須修改非Null值數據的情況下方便地把Null值排到最前面或者最後面,其他資料庫得添加一個輔助列 ...
  • 本文以 `React`、`Vue` 為例,介紹下主流的渲染模式以及在主流框架中如何實現上述的渲染模式。 ## 前置知識介紹 看渲染模式之前我們先看下幾個主流框架所提供的相關能力,瞭解的可跳到下個章節。 ### 掛載組件到 DOM 節點 這是主流框架最基本的能力,就是將組件渲染到指定的 `DOM` 節 ...
  • 關鍵字 abstractassertbooleanbreakbyte case catch char class const continue default do double else enum extends final finally float for goto if implementi ...
  • 不說廢話,直接上乾貨: (註意大小寫:object為對象,Object為類) 1,object.getClass()它是Object類的實例方法,返回一個對象運行時的類的Class對象,換句話說,它返回的是對象具體類型的類對象。 2,Object.class 這是java語言的一種語法糖,用來返回一 ...
  • # 前言 最近針對java項目的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等 發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則複雜對於小白很不友好,也難以接入到自定義的部署工具/平臺中 之前開發的Jar包部署平臺是servlet ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...