網站首頁 編程語言 正文
修改numpy array數據類型
1、numpy數據類型
數據名稱 | 說明 |
---|---|
bool | 布爾類型,true,false |
int_ | 默認的整數類型(類似于 C 語言中的 long,int32 或 int64) |
intc | 與 C 的 int 類型一樣,一般是 int32 或 int 64 |
intp | 用于索引的整數類型(類似于 C 的 ssize_t,一般情況下仍然是 int32 或 int64) |
int8 | 字節(-128 to 127) |
int16 | 整數(-32768 to 32767) |
int32 | 整數(-2147483648 to 2147483647) |
int64 | 整數(-9223372036854775808 to 9223372036854775807) |
uint8 | 無符號整數(0 to 255) |
uint16 | 無符號整數(0 to 65535) |
uint32 | 無符號整數(0 to 4294967295) |
uint64 | 無符號整數(0 to 18446744073709551615) |
float_ | float64 類型的簡寫 |
float16 | 半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位 |
float32 | 單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位 |
float64 | 雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位 |
complex_ complex128 | 類型的簡寫,即 128 位復數 |
complex64 | 復數,表示雙 32 位浮點數(實數部分和虛數部分) |
complex128 | 復數,表示雙 64 位浮點數(實數部分和虛數部分) |
2、改變numpy array數據類型
用astype()方法改變數據類型,如下幾種方式所示(這種方法不會改變原數組的數據類型):
array_name.astype(int) ?
array_name.astype(np.int16)
array_name.astype('float64')
如果要改變原數組的數據類型,用以下方法:
array_name.dtype = np.uint8
numpy數據類型說明及自動轉換陷阱
numpy的dtype是一個很重要的概念,因為numpy為了性能,優化了內存管理,ndarray的值在內存中幾乎是連續的,同時其每個元素的內存大小也被設計成是一樣的,因此,當生成ndarray時,每個元素的數據類型都會被轉為相同的類型,這時如果原生的數據類型是不一樣的,那么就涉及到一個數據類型轉換的問題,即data type casting。
明白numpy中的數據類型轉換可以有效的避免和理解很多的行為,因為numpy中很多的error往往都是有數據類型轉換引起的,所以理解numpy的數據類型轉換可以預防和排查很多的問題。首先,在numpy中有很多的數據類型,多于python內置數據類型,具體有哪些類型,可以參看下圖,下圖的columns和index是數據類型在numpy中的符號,具體的釋義可以查看這里。下面,我們重點講一下numpy中關于數據類型以及轉換中容易碰到的陷進或者需要注意的點。
1、數據類型的表示
在numpy中,一個數據類型實際上是一個dtype對象,其有一些重要的屬性,比如字節順序、數據類型、字節數大小等,一般的,numpy中的數據類型會表示成類似'<i4'這樣,這個表示法中,<表示字節順序,i表示數據類型,這里表示整數,4表示一個元素占據的字節數,這里4字節,表示32位整數。
2、構造ndarray時的dtype
在構造ndarray時,可以指定dtype參數來設置ndarray里面元素的數據類型,這個dtype可以用'i4'這樣的表示方式,也可以用int表示,但是后者沒法指定字節數。要注意的是,指定dtype時,一定要確認這個dtype可以兼容所有元素,防止溢出或者不兼容,對此我們可以通過result_type(*array_like)來判斷我們應該設定的dtype,這個函數返回的dtype是可以兼容所有元素的最小size的數據類型;或者我們無需設定,其會自動進行數據類型的轉換,我們也可以通過ndarray.dtype屬性查看數據類型。Anyway,我們要有這種數據類型轉換的意識,因為這會影響后續對ndarray的操作。
3、不同數據類型之間的轉換兼容性
?numpy的數據類型之間能夠實現轉換,可以通過np.can_cast(fromtype,totype)這個函數來判斷,更詳細的可以查看下圖。
4、numpy對python對象數據類型'O'的處理
?當numpy中有python獨有的原生數據類型,比如Decimal,那么ndarray會被轉為object數據類型,表示python對象數據類型,當然這里也可以轉為字符串,但是字符串對于np.nan往往會占據更大的itemsize。
當numpy函數對dtype位object的ndarray處理時,會先把里面的元素再進一步轉為其他numpy的數據類型,這樣才可以操作,所以這里如果函數沒法或沒有指定類型參數,那么會默認以第一個inner loop到的數據類型作為所有元素的類型,并以此類型進行后續轉換,這時,對于object類型的ndarray來說,往往容易出現數據無法轉換成功的異常。所以要注意處理時第一個inner loop遇到的元素的類型是否可以兼容后面要處理的所有元素,不然會拋出異常。看下面的例子說明。
import numpy as np
from decimal import Decimal
arr=np.array([[1,2.0,3],['a',3,np.nan],[2,np.nan,Decimal('5')]])
arr1=np.apply_along_axis(lambda x:x[0],arr=arr,axis=1)
arr1
# output:
# ValueError: invalid literal for int() with base 10: 'a'
arr2=np.apply_along_axis(lambda x:x[1],arr=arr,axis=1)
arr2
# output:
# array([ 2., 3., nan])
arr2=np.apply_along_axis(lambda x:x[2],arr=arr,axis=1)
arr2
# output:
# array([ 3, -2147483648, 5])
從上面的例子中可以看到,arr1中,由于第一個inner loop遇到的元素是整數1,所以便會以整數類型對后續的元素進行轉換,但是后面的一個元素是字符'a',無法將其轉為int,因此就會報上述error;arr2中,第一個遇到的元素是2.0,為float,所以后面的元素都會被轉為float,因此輸出為array([ 2., ?3., nan]),其中都變成了float,要注意的是,由于np.nan本身就是一個浮點數,因此這里可以正確的轉換,轉換之后還是np.nan;但是看arr2,由于第一個遇到的元素類型為int32,后面的np.nan為float64,會造成溢出,這樣便無法正確的轉換,從而會用int32最接近np.nan的值去替換,所以就是-2**31==-2147483648,這里之所以是2**31,而不是2**32-1,是因為這里的int是signed int,即有正負號的int,所以其范圍是-2**31~2**31-1;而Decimal('5')被轉為了int 5,所以就出現了上述的結果。
?所以,當要被轉成ndarray的原始數據中有np.nan時,要特別注意這一點,最好是指定float類型,注意其他數據的兼容;而如果同時又是obejct數據類型時,那么同時也要注意第一個inner loop遇到的元素的數據類型,注意和后面的數據類型保持兼容。
小結:numpy的dtype有諸多陷進,需要小心對待,謹慎核查,然后靈活運用。
原文鏈接:https://blog.csdn.net/sunmingyang1987/article/details/111591712
相關推薦
- 2022-03-31 python常用內置模塊你了解嗎_python
- 2022-07-19 AI與Python人工智能啟發式搜索概念理解_python
- 2022-06-12 Python中property屬性的用處詳解_python
- 2022-11-15 詳解kubelet?創建pod流程代碼圖解及日志說明_云其它
- 2023-01-18 GO實現跳躍表的示例詳解_Golang
- 2022-08-05 利用Python?list列表修改元素_python
- 2022-04-07 C語言的線性表之順序表你了解嗎_C 語言
- 2022-08-29 .NET?Core讀取配置文件_實用技巧
- 最近更新
-
- 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同步修改后的遠程分支