一、Numpy數組基本用法
1、Numpy
是Python
科學計算庫,用於快速處理任意維度的數組。
2、NumPy
提供一個N維數組類型ndarray,它描述了相同類型的“items”的集合。
3、numpy.ndarray
支持向量化運算。
4、NumPy
使用c語言寫的,底部解除了GIL
,其對數組的操作速度不在受python
解釋器限制。
二、numpy中的數組:
Numpy
中的數組的使用跟Python
中的列表非常類似。他們之間的區別如下:
1、一個列表中可以存儲多種數據類型。比如a = [1,'a']
是允許的,而數組只能存儲同種數據類型。
2、數組可以是多維的,當多維數組中所有的數據都是數值類型的時候,相當於線性代數中的矩陣,是可以進行相互間的運算的。
三、創建數組(np.ndarray對象):
Numpy
經常和數組打交道,因此首先第一步是要學會創建數組。在Numpy
中的數組的數據類型叫做ndarray
。以下是兩種創建的方式:
1、根據Python
中的列表生成:
import numpy as np
a1 = np.array([1,2,3,4])
print(a1)
print(type(a1))
2、使用np.arange
生成,np.arange
的用法類似於Python
中的range
:
import numpy as np
a2 = np.arange(2,21,2)
print(a2)
3、使用np.random
生成隨機數的數組:
a1 = np.random.random(2,2) # 生成2行2列的隨機數的數組
a2 = np.random.randint(0,10,size=(3,3)) # 元素是從0-10之間隨機的3行3列的數組
4、使用函數生成特殊的數組:
import numpy as np
a1 = np.zeros((2,2)) #生成一個所有元素都是0的2行2列的數組
a2 = np.ones((3,2)) #生成一個所有元素都是1的3行2列的數組
a3 = np.full((2,2),8) #生成一個所有元素都是8的2行2列的數組
a4 = np.eye(3) #生成一個在斜方形上元素為1,其他元素都為0的3x3的矩陣
四、ndarray常用屬性:
ndarray.dtype
:
因為數組中只能存儲同一種數據類型,因此可以通過dtype
獲取數組中的元素的數據類型。以下是ndarray.dtype
的常用的數據類型:
數據類型 | 描述 | 唯一標識符 |
---|---|---|
bool | 用一個字節存儲的布爾類型(True或False) | 'b' |
int8 | 一個字節大小,-128 至 127 | 'i1' |
int16 | 整數,16 位整數(-32768 ~ 32767) | 'i2' |
int32 | 整數,32 位整數(-2147483648 ~ 2147483647) | 'i4' |
int64 | 整數,64 位整數(-9223372036854775808 ~ 9223372036854775807) | 'i8' |
uint8 | 無符號整數,0 至 255 | 'u1' |
uint16 | 無符號整數,0 至 65535 | 'u2' |
uint32 | 無符號整數,0 至 2 ** 32 - 1 | 'u4' |
uint64 | 無符號整數,0 至 2 ** 64 - 1 | 'u8' |
float16 | 半精度浮點數:16位,正負號1位,指數5位,精度10位 | 'f2' |
float32 | 單精度浮點數:32位,正負號1位,指數8位,精度23位 | 'f4' |
float64 | 雙精度浮點數:64位,正負號1位,指數11位,精度52位 | 'f8' |
complex64 | 復數,分別用兩個32位浮點數表示實部和虛部 | 'c8' |
complex128 | 復數,分別用兩個64位浮點數表示實部和虛部 | 'c16' |
object_ | python對象 | 'O' |
string_ | 字符串 | 'S' |
unicode_ | unicode類型 | 'U' |
我們可以看到,Numpy
中關於數值的類型比Python
內置的多得多,這是因為Numpy
為了能高效處理處理海量數據而設計的。舉個例子,比如現在想要存儲上百億的數字,並且這些數字都不超過254(一個字節內),我們就可以將dtype
設置為int8
,這樣就比默認使用int64
更能節省內存空間了。類型相關的操作如下:
1、默認的數據類型:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype)
# 如果是windows系統,默認是int32
# 如果是mac或者linux系統,則根據系統來
2、指定
dtype:
import numpy as np
a1 = np.array([1,2,3],dtype=np.int64)
# 或者 a1 = np.array([1,2,3],dtype="i8")
print(a1.dtype)
3、修改
dtype:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) # window系統下默認是int32
# 以下修改dtype
a2 = a1.astype(np.int64) # astype不會修改數組本身,而是會將修改后的結果返回
print(a2.dtype)
ndarray.size
:
獲取數組中總的元素的個數。比如有個二維數組:
import numpy as np
a1 = np.array([[1,2,3],[4,5,6]])
print(a1.size) #打印的是6,因為總共有6個元素
ndarray.ndim
:
數組的維數。比如:
a1 = np.array([1,2,3])
print(a1.ndim) # 維度為1
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim) # 維度為2
a3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(a3.ndim) # 維度為3
ndarray.shape
:
數組的維度的元組。比如以下代碼:
a1 = np.array([1,2,3])
print(a1.shape) # 輸出(3,),意思是一維數組,有3個數據
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.shape) # 輸出(2,3),意思是二位數組,2行3列
a3 = np.array([
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
]
])
print(a3.shape) # 輸出(2,2,3),意思是三維數組,總共有2個元素,每個元素是2行3列的
a44 = np.array([1,2,3],[4,5])
print(a4.shape) # 輸出(2,),意思是a4是一個一維數組,總共有2列
print(a4) # 輸出[list([1, 2, 3]) list([4, 5])],其中最外面層是數組,里面是Python列表
另外,我們還可以通過ndarray.reshape
來重新修改數組的維數。示例代碼如下:
a1 = np.arange(12) #生成一個有12個數據的一維數組
print(a1)
a2 = a1.reshape((3,4)) #變成一個2維數組,是3行4列的
print(a2)
a3 = a1.reshape((2,3,2)) #變成一個3維數組,總共有2塊,每一塊是2行2列的
print(a3)
a4 = a2.reshape((12,)) # 將a2的二維數組重新變成一個12列的1維數組
print(a4)
a5 = a2.flatten() # 不管a2是幾維數組,都將他變成一個一維數組
print(a5)
注意,reshape
並不會修改原來數組本身,而是會將修改后的結果返回。如果想要直接修改數組本身,那么可以使用resize
來替代reshape
。
ndarray.itemsize
:
數組中每個元素占的大小,單位是字節。比如以下代碼:
a1 = np.array([1,2,3],dtype=np.int32)
print(a1.itemsize) # 打印4,因為每個字節是8位,32位/8=4個字節
jupyter:
總結:
1、數組一般達到3維就已經很復雜了,不太方便計算了,所以我們一般都會把3維以上的數組轉換成2維數組來計算
2、通過ndarray.ndim可以看到數組的維度
3、通過ndarray.shape可以看到數組的形狀(幾行幾列),shape是一個元組,里面又幾個元素代表是幾維數組
4、通過ndarray.reshape可以修改數組的形狀。條件只有一個,就是修改后的形狀的元素個數必須和原來一致。
reshape不會修改原來數組的形狀,只會將修改完的結果返回
5、通過ndarray.size可以看到數組有多少個元素。
6、通過ndarray.itemsize可以看到數組中的每個元素所占內存的大小,單位是字節(一個字節 = 8個單位)