NumPy 是什麼?
NumPy是使用Python進行科學計算的基礎軟件包。除其他外,它包括:
功能強大的N維數組對象。
精密廣播功能函數。
集成 C/C+和Fortran 代碼的工具。
強大的線性代數、傅立葉變換和隨機數功能。
#全部行都能輸出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
利器之一:Ndarray
NumPy 最重要的一個特點是其 N 維數組對象 ndarray,它是一系列同類型數據的集合,以 0 下標爲開始進行集合中元素的索引。ndarray 對象是用於存放同類型元素的多維數組。ndarray 中的每個元素在內存中都有相同存儲大小的區域。
數組(ndarray)的創建
import numpy as np
一維數組的創建
np.array
#生成數組的時候還可以指定數組基本元素類型。
a=np.array([1,2,3,4])
np.arange函數
np.arange(10)
np.arange(0,10,0.2)
np.linspace
help(np.linspace)
np.linspace(0,3,3)
#這個函數裏面有一個參數endpoint,是一個布爾值,
#可以通過對這個參數的設定,來選擇是否包含最後一個數值。
np.linspace(1,8,5,endpoint=False)
array([1. , 2.4, 3.8, 5.2, 6.6])
二維數組的創建
import numpy as np
b=np.array([[1,2,3],[4,5,6]])
c=np.array([[1,"2",3],[4,"5",6]])
d=np.array([[1,"2",3],["4",5,6]])
e=np.array([[1,"2",3],["4",5,6]],dtype="object")
print("b=",b)
print("c=",c)
print("d=",d)
print("e=",e)
b= [[1 2 3]
[4 5 6]]
c= [['1' '2' '3']
['4' '5' '6']]
d= [['1' '2' '3']
['4' '5' '6']]
e= [[1 '2' 3]
['4' 5 6]]
創建數組時候的注意事項:
a.輸入的數組要工整,否則會出現後續一系列處理問題。 a=np.array([1,2,3,[4,5]]) b=np.array([[1,2,3],[4,5]]) 不要創建這樣的數組,雖然創建的過程不會提示出錯。如果創建的對象不工整,建議選擇創建列表對象。
b.輸入數組裏面的元素最好是同一類型,如果不是同一類型,最好指dtype=“object”,否則如果既不是同一類型,又沒有指定數組類型爲object,那麼生成數組之後可能被強制轉化爲字符串。比如下面的例子。
a=np.array([1,2,3.0])
a.dtype
dtype('float64')
b=np.array([1,2,3,"11"])
b #元素會轉化爲字符串類型
b.dtype
dtype('<U11')
c=np.array([[1,2,3],["a","b","c"]])
c #元素會轉化爲字符串類型
array([['1', '2', '3'],
['a', 'b', 'c']], dtype='<U11')
#運行下面這句會有錯誤提示。
d=np.array([1,2,3,"a"],dtype="float")
#下面這一句運行正確,無錯誤提示。
d=np.array([1,2,3,"a"],dtype="object")
d
array([1, 2, 3, 'a'], dtype=object)
ValueError Traceback (most recent call last)
<ipython-input-225-7d6178ef8f85> in <module>
1 #運行下面這句會有錯誤提示。
----> 2 d=np.array([1,2,3,"a"],dtype="float")
ValueError: could not convert string to float: 'a'
#如何查看numpy定義了哪些dtype?
np.typeDict
{'?': numpy.bool_,
0: numpy.bool_,
'byte': numpy.int8,
'b': numpy.int8,
1: numpy.int8,
'ubyte': numpy.uint8,
'B': numpy.uint8,
…… ……
數組的屬性
a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3])
a
array([[1, 2, 3],
[4, 5, 6]])
ndim屬性
#ndim屬性
a.ndim #返回2
2
b.ndim #返回1
1
shape屬性
a.shape #返回(2,3)
b.shape #返回(3,),這是一個只包含一個元素的元組。
(2, 3)
(3,)
size屬性
a.size
6
dtype屬性
a.dtype
dtype('int32')
itemsize屬性
itemsize : int | The memory use of each array element in bytes.
a=np.array([1,2,3])
a.itemsize
4
b=np.array(["劉","1","2"])
b.itemsize
4
#如果想查看數組實例的其他屬性可以運行下面的代碼
help(a)
缺失值問題
python中的缺失值有np.nan,None等,後面的章節會詳細說明。
#np.nan是一個float類型的值
type(np.nan)
float
#定義一個含有缺失值的一維數組,數組類型爲float。
a=np.array([1,2,np.nan])
a.dtype
dtype('float64')
#定義一個含有缺失值的字符串數組。
#下面的命令可能並不是你想要的,這會把缺失值轉換成"nan"
a=np.array(["1","2",np.nan])
a
array(['1', '2', 'nan'], dtype='<U3')
#下面講兩個正確的定義方法
#方法1
#a的類型爲object
a=np.array(["1","2",None])
print(a[2])
None
#方法2
a=np.array(["1","2",np.nan],dtype="object")
a
array(['1', '2', nan], dtype=object)
np.isnan函數
a=np.array([1,2,3,np.nan])
np.isnan(a)
array([False, False, False, True])
#np.isnan("a")
#np.isnan(None)
#運行上面兩句會有錯誤提示,因爲這個函數的參數不能是字符串,或者是字符串組成的數組。
np.isnan(1) #裏面的參數可以是一個數值,或者數值組成的數組。返回False
False
一些特殊數組的快速創建
元素全部爲0的數組
np.zeros((2,3)) #參數是數組的形狀
array([[0., 0., 0.],
[0., 0., 0.]])
元素全部爲1的數組
np.ones((3,3))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
用指定的元素將數組填滿
np.full((2,3),"a")
array([['a', 'a', 'a'],
['a', 'a', 'a']], dtype='<U1')
np.full((2,3),[1,2,3])
array([[1, 2, 3],
[1, 2, 3]])
np.full((2,3),[1,2]) #注意運行這句會有錯誤提示,因爲不能將指定的內容(第二個參數),廣播到我們指定形狀的數組(2*3)
生成單位矩陣
np.eye() #生成一個單位矩陣,因爲單位矩陣是一個方陣, 所以只指定一個行數或者列數就可以,不用指定多個數。
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
生成一個未初始化的(任意的)指定形狀的數組
#生成一個未初始化的(任意的)指定形狀的數組
np.empty((3,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
生成一個對角線矩陣
#生成一個對角線矩陣
np.diag([1,2,3,4])
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
np.random模塊:隨機數組的生成
np.random模塊下的部分函數說明
函數描述
seed 向隨機數生成器傳遞隨機種子
rand 從均勻分佈中抽取樣本 ,取值範圍爲0到1
uniform 從均勻分佈中抽取樣本
randint 根據給定的範圍抽取隨機整數
randn 從均值爲0方差爲1的正態分佈中抽取樣本
normal 從正態分佈中抽取樣本
| choice |從一個一維數組中隨機抽取一個樣本
np.random.randint(10,20,(3,4))
array([[17, 17, 10, 12],
[19, 19, 13, 12],
[15, 18, 11, 10]])
np.random.choice(np.array(["張三","李四","王五"]),5)
#可以設定樣本量和各個值被抽中的概率
array(['王五', '王五', '李四', '李四', '張三'], dtype='<U2')
#打亂數組元素順序
a=np.array([1,2,3,4])
np.random.shuffle(a) #不會返回對象,會直接作用於數組a
a
array([4, 2, 1, 3])
累積求和
# 累積求和
import numpy as np
a=np.random.randint(1,10,5)
print("a=",a)
print("a.cumsum=",a.cumsum())
a= [4 6 1 4 7]
a.cumsum= [ 4 10 11 15 22]
b=np.random.randint(1,10,(5,2))
print("b=",b)
print("b.cumsum(axis=0)=",b.cumsum(axis=0))
b= [[1 5]
[5 6]
[8 7]
[7 3]
[5 3]]
b.cumsum(axis=0)= [[ 1 5]
[ 6 11]
[14 18]
[21 21]
[26 24]]
print("b.cumsum(axis=1)=",b.cumsum(axis=1))
b.cumsum(axis=1)= [[ 1 6]
[ 5 11]
[ 8 15]
[ 7 10]
[ 5 8]]