[Python][NumPy] N維數組類型 ndarray,形狀,資料結構,索引切片介紹

更新於 發佈於 閱讀時間約 8 分鐘

NumPy 提供了一種 N 維數組類型 ndarray(N-dimensional array) 它描述了相同類型的「數據類型」的集合。


ndarray 形狀大小

多維數組: ndarray 是一個 N 維數組,其中 N 可以是任意整數。一維數組是向量,二維數組是矩陣,以此類推

.shape

利用shape屬性查看,ndarray 在形狀描述了數組在每個維度上的大小。例如,形狀為 (2, 3) 的數組表示一個二維數組,其中維度為 2每行資料長度為3

import numpy as np

# 創建一個一維數組
arr1 = np.array([1, 2, 3, 4, 5])

# 創建一個二維數組
arr2 = np.array([[1, 2, 3],
[4, 5, 6]])

print("arr1.shape:", arr1.shape) # 輸出: (5,)
print("arr2.shape:", arr2.shape) # 輸出: (2, 3)

ndarray 數據類型

所有 ndarray 中的元素都需要具有相同的數據類型。這有助於提高數組的效率,因為 NumPy 可以針對特定數據類型進行優化

ndarray 中的元素具有特定的數據類型,如整數、浮點數、複數等。可以使用 dtype 屬性查看或設置數據類型。

.dtype

使用 dtype 屬性查看, ndarray 的資料型態。

import numpy as np

# 創建一個ndarray
arr = np.array([1, 2, 3, 4, 5])

# 創建一個包含整數和浮點數的ndarray
arr_mixed = np.array([1, 2.5, 3, 4.2, 5])

# 查看ndarray的資料型態
print("arr資料型態:", arr.dtype) #輸出 arr資料型態: int32
print("arr_mixed資料型態:", arr_mixed.dtype) #輸出 arr_mixed資料型態: float64

可以在創建 NumPy 數組的過程中使用 dtype 參數,明確指定數據類型

import numpy as np

# 使用 dtype 參數創建一個整數數組
arr_int = np.array([1, 2, 3, 4, 5], dtype=np.int32)

# 使用 dtype 參數創建一個浮點數數組
arr_float = np.array([1.1, 2.2, 3.3, 4.4, 5.5], dtype=np.float64)

# 使用 dtype 參數創建一個複數數組
arr_complex = np.array([1 + 2j, 3 + 4j, 5 + 6j], dtype=np.complex128)

# 查看數組的資料型態
print("整數數組的資料型態:", arr_int.dtype) #輸出 整數數組的資料型態: int32
print("浮點數數組的資料型態:", arr_float.dtype) #輸出 浮點數數組的資料型態: float64
print("複數數組的資料型態:", arr_complex.dtype) #輸出 複數數組的資料型態: complex128

分別使用 np.int32np.float64np.complex128 作為 dtype 參數來指定數據的類型。你可以根據需要選擇適當的 dtype,它包括整數、浮點數、複數等不同的類型。

這種明確指定數據類型的方式可以確保數據被正確地儲存處理


ndarray 索引切片

在 NumPy 中,你可以使用索引切片操作來訪問和修改 ndarray 中的元素

以下是一些基本的索引和切片操作:

索引操作:

一維數組:

索引的元素編號是從0開始。

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 獲取第三個元素
print(arr[2]) # 輸出: 3

# 修改第一個元素
arr[0] = 10

print(arr) #輸出 [10 2 3 4 5]

多維數組:

import numpy as np

arr_2d = np.array([[1, 2, 3],
[4, 5, 6]])

# 獲取第一行第二列的元素
print(arr_2d[0, 1]) # 輸出: 2

# 修改第二行第三列的元素
arr_2d[1, 2] = 99

print(arr_2d)

#輸出
# [[ 1 2 3]
# [ 4 5 99]]

索引和切片操作在 NumPy 中是零起始的,這意味著第一個元素的索引是0


切片操作:

一維數組:

[:3] 表示選擇索引 0 到 2(不包括索引 3)的所有元素。

[-2:] 表示選擇倒數第二個元素到最後一個元素的所有元素。

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 獲取前三個元素
print(arr[:3]) # 輸出: [1, 2, 3]

# 修改後兩個元素
arr[-2:] = 0

print(arr) #輸出 [1 2 3 0 0]

二維數組:

[0, :]

  • 這個切片表示選擇數組的第一行(索引為0的行)的所有列。
  • 0 表示選擇的是第一行,而 : 表示選擇整個第一行的所有列。

[:, 1]

  • 這個切片表示選擇數組的所有行的第二列(索引為1的列)。
  • : 表示選擇整個所有行,而 1 表示選擇第二列。

[1:, 1:]

  • 這個切片表示選擇數組的第二行及之後的所有行,以及第二列及之後的所有列。
  • 1: 表示選擇從索引1(第二行)開始的所有行,而 1: 表示選擇從索引1(第二列)開始的所有列。
import numpy as np

# 創建一個二維數組
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

# 獲取第一行
first_row = arr_2d[0, :]
print("第一行:", first_row) # 輸出: [1, 2, 3]

# 獲取第二列
second_column = arr_2d[:, 1]
print("第二列:", second_column) # 輸出: [2, 5, 8]

# 使用切片獲取子矩陣
submatrix = arr_2d[1:, 1:]
print("子矩陣:")
print(submatrix)
# 輸出:
# [[5, 6],
# [8, 9]]

# 修改切片中的元素
arr_2d[1:, 1:] = 0
print("修改後的數組:")
print(arr_2d)
# 輸出:
# [[1, 2, 3],
# [4, 0, 0],
# [7, 0, 0]]

這些切片操作讓你能夠靈活地選擇 NumPy 數組中的不同子集,進行查看、修改或進行進一步的計算。


NumPy 中的 ndarray 之所以能夠提供高效的速度。

基於以下幾個關鍵:

  1. 底層實現: NumPy 的底層實現是用 C 語言編寫的。比 Python 更接近硬體,執行會更高效。
  2. 連續的內存布局: NumPy 的數組在記憶體中是連續存儲的,這使得對數組的訪問和操作更加高效。例如(一維的 NumPy 數組 [1, 2, 3, 4, 5],這五個元素將按照順序依次存儲在記憶體中的相鄰位置,可以直接訪問數組中的每一個元素,而不需要額外的計算或跳躍)
  3. 廣播(Broadcasting): NumPy 支持廣播操作,允許在不同形狀的數組之間進行操作。
  4. 向量化操作: NumPy 支持向量化操作,即對整個數組執行操作而無需使用顯式循環(for迴圈)。這使得在數組上進行數學和邏輯運算更加簡單,同時也更快速,因為底層操作可以在 C底層進行。
  5. 使用原生數據類型: NumPy 使用原生數據類型,而不是 Python 中的對象。這意味著數組中的元素在內存中是連續存儲的,且數據類型是已知的。相比於 Python 對象,這減少了內存開銷運行時開銷
  6. 優化的算法: NumPy 中的許多操作都經過了高度優化,例如矩陣乘法、FFT(快速傅立葉變換)等。底層的優化算法使得這些操作在處理大規模數據時能夠更加高效

參考文獻


留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
297內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2024/09/14
生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 [] 替換為小括號 ()。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。 生成器的「惰性評估」(也叫延遲求值)指的是生成器不
Thumbnail
2024/09/14
生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 [] 替換為小括號 ()。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。 生成器的「惰性評估」(也叫延遲求值)指的是生成器不
Thumbnail
2024/09/01
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
Thumbnail
2024/09/01
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
Thumbnail
2024/09/01
為了讓資料更適合進行後續的分析、建立模型,模型的決策準確性,資料探索與清理是資料分析過程中非常重要的步驟,主要目的在於確保資料的品質和可靠性。 因為前幾篇的例子中的資料,並沒有缺失值與重複值的部分,我另外找了一份有包含的資料來做案例分析,由於找到的資料沒有重複值的部分,故本文主要解釋處理缺失值的部
Thumbnail
2024/09/01
為了讓資料更適合進行後續的分析、建立模型,模型的決策準確性,資料探索與清理是資料分析過程中非常重要的步驟,主要目的在於確保資料的品質和可靠性。 因為前幾篇的例子中的資料,並沒有缺失值與重複值的部分,我另外找了一份有包含的資料來做案例分析,由於找到的資料沒有重複值的部分,故本文主要解釋處理缺失值的部
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
題目敘述 Subarray Sums Divisible by K 給定一個整數陣列,請計算有幾個區間和能夠整除k的連續區間? 測試範例 Input: nums = [4,5,0,-2,-3,1], k = 5 Output: 7
Thumbnail
題目敘述 Subarray Sums Divisible by K 給定一個整數陣列,請計算有幾個區間和能夠整除k的連續區間? 測試範例 Input: nums = [4,5,0,-2,-3,1], k = 5 Output: 7
Thumbnail
這篇文章,會帶著大家複習以前學過的數列DP框架, 並且以費式數列、爬樓梯、骨牌拚接的應用與遞迴數列概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 數列DP與遞迴數列常見的形式 如果是遞迴數列,常常看到以函數型式表達
Thumbnail
這篇文章,會帶著大家複習以前學過的數列DP框架, 並且以費式數列、爬樓梯、骨牌拚接的應用與遞迴數列概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 數列DP與遞迴數列常見的形式 如果是遞迴數列,常常看到以函數型式表達
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
NumPy 提供了一種 N 維數組類型 ndarray(N-dimensional array) ,它描述了相同類型的「數據類型」的集合。 多維數組: ndarray 是一個 N 維數組,其中 N 可以是任意整數。一維數組是向量,二維數組是矩陣
Thumbnail
NumPy 提供了一種 N 維數組類型 ndarray(N-dimensional array) ,它描述了相同類型的「數據類型」的集合。 多維數組: ndarray 是一個 N 維數組,其中 N 可以是任意整數。一維數組是向量,二維數組是矩陣
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定我們一個二維陣列,要求我們計算內部元素相同的column row pairs總共有多少條? 註: pair的定義就是row i 和 column j 彼此內部元素值都相同,這樣就算一條pair。 題目的原文敘述 測試範例 Example 1: Input: gr
Thumbnail
題目敘述 題目會給定我們一個二維陣列,要求我們計算內部元素相同的column row pairs總共有多少條? 註: pair的定義就是row i 和 column j 彼此內部元素值都相同,這樣就算一條pair。 題目的原文敘述 測試範例 Example 1: Input: gr
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定一個陣列nums 和 給定的k值,要求我們找出陣列裡第k大的元素。 題目的原文敘述 測試範例 Example 1: Input: nums = [3,2,1,5,6,4], k = 2 Output: 5 第二大的元素為5​ Example 2: Input:
Thumbnail
題目敘述 題目會給定一個陣列nums 和 給定的k值,要求我們找出陣列裡第k大的元素。 題目的原文敘述 測試範例 Example 1: Input: nums = [3,2,1,5,6,4], k = 2 Output: 5 第二大的元素為5​ Example 2: Input:
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News