網站首頁 編程語言 正文
NumPy 或 Numeric Python 是一個用于計算同質 n 維數組的包。在 numpy 維度中稱為軸。
為什么我們需要 NumPy?
出現了一個問題,當 python 列表已經存在時,為什么我們需要 NumPy。答案是我們不能直接對兩個列表的所有元素執行操作。例如,我們不能直接將兩個列表相乘,我們必須逐個元素地進行。這就是 NumPy 發揮作用的地方。
示例 #1:
# 演示需要 NumPy 的 Python 程序 list1 = [1, 2, 3, 4 ,5, 6] list2 = [10, 9, 8, 7, 6, 5] # 將兩個列表直接相乘會出錯。 print(list1*list2)
輸出 :
TypeError: can't multiply sequence by non-int of type 'list'
因為這可以通過 NumPy 數組輕松完成。
示例 #2:
# 演示 NumPy 數組使用的 Python 程序 import numpy as np list1 = [1, 2, 3, 4, 5, 6] list2 = [10, 9, 8, 7, 6, 5] # 將 list1 轉換為 NumPy 數組 a1 = np.array(list1) # 將 list2 轉換為 NumPy 數組 a2 = np.array(list2) print(a1*a2)
輸出 :
array([10, 18, 24, 28, 30, 30])
python的numpy包具有以不同方式索引的強大功能。
使用索引數組進行索引
索引可以通過使用數組作為索引在 numpy 中完成。在切片的情況下,返回數組的視圖或淺表副本,但在索引數組中返回原始數組的副本。Numpy 數組可以用其他數組或任何其他序列索引,但元組除外。最后一個元素由 -1 索引,第二個由 -2 索引,依此類推。
示例 #1:
# 演示索引數組使用的 Python 程序。 import numpy as np # 創建一個從 10 到 1 的整數序列,步長為 -2 a = np.arange(10, 1, -2) print("\n A sequential array with a negative step: \n",a) # 索引在 np.array 方法中指定。 newarr = a[np.array([3, 1, 2 ])] print("\n Elements at these indices are:\n",newarr)
輸出 :
A sequential array with a negative step:
[10 ?8 ?6 ?4 ?2]
Elements at these indices are:
[4 8 6]
示例 #2:
import numpy as np # 元素從 1 到 9 的 NumPy 數組 x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # 索引值可以是負數。 arr = x[np.array([1, 3, -3])] print("\n Elements are : \n",arr)
輸出 :
Elements are:
[2 4 7]
索引類型
有兩種類型的索引:
基本切片和索引
考慮語法 x[obj],其中 x 是數組,obj 是索引。切片對象是基本切片情況下的索引。當 obj 為 時發生基本切片:
- 形式為 start : stop : step 的切片對象
- 一個整數
- 或切片對象和整數的元組
基本切片生成的所有數組始終是原始數組的視圖。
代碼#1:
# 用于基本切片的 Python 程序。 import numpy as np # 從 0 到 19 排列元素 a = np.arange(20) print("\n Array is:\n ",a) # a[start:stop:step] print("\n a[-8:17:1] = ",a[-8:17:1]) # : 運算符表示直到最后的所有元素。 print("\n a[10:] = ",a[10:])
輸出 :
Array is:
[ 0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 10 11 12 13 14 15 16 17 18 19]
a[-8:17:1] ?= ?[12 13 14 15 16]
a[10:] = [10 11 12 13 14 15 16 17 18 19]?
代碼#2:
# 用于基本切片和索引的 Python 程序 import numpy as np # A 3-Dimensional array a = np.array([[0, 1, 2, 3, 4, 5] [6, 7, 8, 9, 10, 11] [12, 13, 14, 15, 16, 17] [18, 19, 20, 21, 22, 23] [24, 25, 26, 27, 28, 29] [30, 31, 32, 33, 34, 35]] print("\n Array is:\n ",a) # 切片和索引 print("\n a[0, 3:5] = ",a[0, 3:5]) print("\n a[4:, 4:] = ",a[4:, 4:]) print("\n a[:, 2] = ",a[:, 2]) print("\n a[2:;2, ::2] = ",a[2:;2, ::2])
輸出 :
Array is:
?[[0 ?1 ?2 ?3 ?4 ?5]?
? [6 7 8 9 10 11]
? [12 13 14 15 16 17]
? [18 19 20 21 22 23]
? [24 25 26 27 28 29]
? [30 31 32 33 34 35]]
a[0, 3:5] ?= ?[3 4]
a[4:, 4:] = [[28 29],
? ? ? ? ? ? ?[34 35]]
a[:, 2] = ?[2 8 14 20 26 32]
a[2:;2, ::2] = [[12 14 16],
? ? ? ? ? ? ? ? [24 26 28]]
下圖讓概念更清晰:
省略號也可以與基本切片一起使用。省略號 (...) 是 : 對象的數量,需要創建一個長度與數組維度相同的選擇元組。
# 使用帶省略號的基本切片進行索引的 Python 程序 import numpy as np # A 3 dimensional array. b = np.array([[[1, 2, 3],[4, 5, 6]], [[7, 8, 9],[10, 11, 12]]]) print(b[...,1]) #Equivalent to b[: ,: ,1 ]
輸出 :
[[ 2 5]?
?[ 8 11]]
高級索引
當 obj 為 - 時觸發高級索引
- 整數或布爾類型的 ndarray
- 或具有至少一個序列對象的元組
- 是一個非元組序列對象
高級索引返回數據的副本而不是它的視圖。高級索引有整數和布爾兩種類型。
純整數索引: 當整數用于索引時。第一維的每個元素都與第二維的元素配對。所以本例中元素的索引為 (0,0),(1,0),(2,1) 并選擇相應的元素。
# 顯示高級索引的 Python 程序 import numpy as np a = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]]) print(a[[0 ,1 ,2 ],[0 ,0 ,1]])
輸出 :
[1 3 6]
結合高級索引和基本索引
當索引中至少有一個切片 (:)、省略號 (...) 或 newaxis 時(或者數組的維度多于高級索引),則行為可能會更復雜。這就像連接每個高級索引元素的索引結果
在最簡單的情況下,只有一個高級索引。例如,單個高級索引可以替換切片,結果數組將是相同的,但是,它是一個副本并且可能具有不同的內存布局。如果可能,切片是優選的。
# 顯示高級和基本索引的 Python 程序 import numpy as np a = np.array([[0 ,1 ,2],[3 ,4 ,5 ], [6 ,7 ,8],[9 ,10 ,11]]) print(a[1:2 ,1:3 ]) print(a[1:2 ,[1,2]])
輸出 :
[4, 5]?
[4, 5]
了解情況的最簡單方法可能是根據結果形狀進行思考。索引操作有兩個部分,由基本索引(不包括整數)定義的子空間和來自高級索引部分的子空間。需要區分兩種索引組合的情況:
高級索引由切片、省略號或 newaxis 分隔。例如x[arr1, :, arr2]
.
高級索引都彼此相鄰。例如x[..., arr1, arr2, :]
,但不是x[arr1, :, 1]?
因為 1 在這方面是一個高級索引。
在第一種情況下,高級索引操作產生的維度首先出現在結果數組中,然后是子空間維度。在第二種情況下,來自高級索引操作的維度被插入到結果數組中與它們在初始數組中相同的位置(后一種邏輯使簡單的高級索引的行為就像切片一樣)。
布爾數組索引
這個索引有一些布爾表達式作為索引。返回滿足該布爾表達式的那些元素。它用于過濾所需的元素值。
代碼 #1
# 您可能希望選擇大于 50 的數字 import numpy as np a = np.array([10, 40, 80, 50, 100]) print(a[a>50])
輸出 :
[80 100]
代碼 #2
# 您可能希望將 40 的倍數平方 import numpy as np a = np.array([10, 40, 80, 50, 100]) print(a[a%40==0]**2)
輸出 :
[1600 6400])
代碼 #3
# 您可能希望選擇行之和是 10 的倍數的那些元素。 import numpy as np b = np.array([[5, 5],[4, 5],[16, 4]]) sumrow = b.sum(-1) print(b[sumrow%10==0])
輸出 :
array([[ 5, 5], [16, 4]])
原文鏈接:https://juejin.cn/post/7136836779876810760
相關推薦
- 2022-06-02 Python配置文件yaml的用法詳解_python
- 2022-10-23 Python?selenium?八種定位元素的方式_python
- 2023-02-26 Golang時間處理中容易踩的坑分析解決_Golang
- 2022-03-13 c++下迭代器總結_C 語言
- 2024-04-08 SpringBoot緩存注解@Cacheable、@CacheEvict和@CachePut
- 2022-06-28 C語言簡明清晰講解枚舉_C 語言
- 2022-09-23 C/C++中的靜態變量注意事項_C 語言
- 2022-11-16 通用?HTTP?簽名組件的另類實現方式_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支