自學(xué)整理記錄椭蹄,大神見笑
為什么學(xué)習(xí)numpy
- 快速
- 方便
- 科學(xué)計算的基礎(chǔ)庫
什么是numpy
- 一個在Python中做科學(xué)計算的基礎(chǔ)庫创夜,重在數(shù)值計算膝但,也是大部分Python科學(xué)計算庫的基礎(chǔ)庫搔啊,多用于在大型硼莽、多維數(shù)組上執(zhí)行數(shù)值運算
- 導(dǎo)包
import numpy as np
numpy基礎(chǔ)操作
- 創(chuàng)建數(shù)組,生成ndarray
t1 = numpy.arange(3)
t2 = numpy.arange(3, 7)
t3 = numpy.arange(3, 7, 2)
t4 = numpy.arange(0, 1, 0.1)
t5 = numpy.arange(3.0)
print(t1)
print(t2)
print(t3)
print(t4)
print(t5)
輸出:array([0, 1, 2])
array([3, 4, 5, 6])
array([3, 5])
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
array([ 0., 1., 2.])
注:array([0, 1, 2])這種格式就是ndarray
注:np.arange(10)是numpy特有方法侯勉,等于np.array(range(10))
查看ndarray中的元素數(shù)據(jù)類型
t1 = numpy.arange(3)
t1.dtype
- numpy有特有數(shù)據(jù)類型
- 指定ndarray中的元素數(shù)據(jù)類型
np.arange(4,dtype="float32")
- 調(diào)整ndarray中元素的數(shù)據(jù)類型
t1 = np.arange(4,dtype="float32")
t2 = t1.astype("bool")
- 限制小數(shù)位數(shù)
t1 = np.array([random.random() for i in range(10)])
np.round(t1, 2)
- 注:round第二個參數(shù)就表示保留幾位小數(shù)
數(shù)組的形狀
- 查看數(shù)組的形狀
a = numpy.array([1, 2, 3])
b = numpy.array([[1, 2, 3],[4, 5, 6]])
print(a.shape)
print(b.shape)
輸出:(3,)
(2,3)
- 修改數(shù)組的形狀
t1 = numpy.arange(12)
print(t1.reshape((3, 4)))
輸出:([[0,1,2,3], [4,5,6,7], [8,9,10,11]])
注:reshape有返回值猜极,不會改變原來t1的形狀
注:變成一維數(shù)組傳(24,),24為所有元素的個數(shù)
將其他形狀數(shù)組展開成一維數(shù)組
t1 = numpy.arange(12).reshape((3, 4)
t1.flatten()
- 將數(shù)組轉(zhuǎn)置
t1 = np.arange(12).reshape(3,4)
t1.transpose()
t1.T
t1.swapaxes(1,0)
注:轉(zhuǎn)置就是將數(shù)組按對角線為中心交換數(shù)據(jù)
注:轉(zhuǎn)置有上面三種方法
計算
t1 = numpy.arange(12).reshape((3, 4)
print(t1 + 2)
print(t1 - 2)
print(t1 * 2)
print(t1 / 2)
- 注:t1中每個值都會去計算加減乘除
- 注:t1 / 0,如果t1元素的值是0缨叫,則返回nan;如果不是0剪勿,則返回inf
t1 = numpy.arange(12).reshape((3, 4)
t2 = numpy.arange(100,112).reshape((3, 4)
print(t1 + t2)
print(t1 - t2)
print(t1 * t2)
print(t1 / t2)
- 注:對應(yīng)位置的元素做計算
- 注:維度不同的數(shù)組進(jìn)行計算贸诚,符合廣播原則就可以計算;沒有對應(yīng)就會報錯ValueError: operands could not be broadcast together with shapes
- 注:廣播原則:如果兩個數(shù)組的后緣維度的軸長度相等或其中一方的長度為1厕吉,即認(rèn)為廣播兼容酱固,可以計算
軸
- 在numpy中使用0,1,2...數(shù)字表示,一維數(shù)組只有一個0軸头朱;二維數(shù)組(shape(0,0))有0軸和1軸运悲;三維數(shù)組(shape(0,0,0))有0軸和1軸和2軸
numpy讀取數(shù)據(jù)
numpy實際中不會用讀取數(shù)據(jù)庫數(shù)據(jù)功能,因為pandas中有更強(qiáng)大的方法是项钮,了解即可
csv文件,逗號分隔文件班眯,csv文件里所有的數(shù)據(jù)都是用逗號隔開的
讀取
np.loadtxt(frame,dtype="float",delimiter=None,skiprows=0,usecols=None,unpack=False)
參數(shù) | 解釋 |
---|---|
frame | 路徑 |
dtype | 元素數(shù)據(jù)類型,默認(rèn)會把較大的數(shù)據(jù)轉(zhuǎn)化為科學(xué)計數(shù)的方式 |
delimiter | 以什么分隔烁巫,不指定會報錯 |
skiprows | 跳過前x行署隘,一般跳過第一行表頭 |
usecols | 讀取指定的列,索引亚隙,元組類型 |
unpack | 默認(rèn)False磁餐,如果是True則轉(zhuǎn)置 |
numpy索引和切片
- 取單行
t1[2]
- 取連續(xù)多行
t1[2:]
- 取不連續(xù)多行
t1[[2,8,10]]
- 取單列
t1[:,0]
- 取連續(xù)多列
t1[:,2:]
- 取不連續(xù)多列
t1[:,[2,6,8]]
- 同時取單行和單列
t1[2,3]
- 同時取多行和多列
t1[2:5,1:4]
注:冒號:左閉右開
取多個不相鄰的點
t1[[0,2,3],[0,1,3]]
注:取的是坐標(biāo)(0,0)(2,1)(3,3)三個點
修改numpy中的數(shù)值
t1[:,2:4] = 0
注:取到對應(yīng)的行、列阿弃、點賦值即可
修改篩選出來的條件的值
t1[t1 < 10] = 10
注:上面表示所有小于10的點修改為10
numpy中三元運算符
np.where(t < 10, 0, 10)
注:表示所有小于10的數(shù)替換為0诊霹,大于等于10的數(shù)替換為10
numpy中的clip(裁剪)
t.clip(10, 18)
注:表示把小于10的都替換為10,大于18的都替換為18
把值替換為nan
t1.astype(float)
t2[3,3] = np.nan
- 注:如果直接執(zhí)行第二句代碼渣淳,可能會報錯ValueError:cannot convert float NaN to integer脾还,表示不能將int類型的nan賦值給float,nan是float類型
數(shù)組的拼接
- 豎直拼接
t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.vstack((t1, t2))
結(jié)果是array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
- 水平拼接
t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.hstack((t1, t2))
結(jié)果是array([[0,1,2,6,7,8],[3,4,5,9,10,11]])
數(shù)組的行列交換
- 行交換
t1[[1,2],:] = t1[[2,1],:]
- 列交換
t1[:,[1,2]] = t1[:,[2,1]]
numpy更多方法
- 創(chuàng)建一個全0的數(shù)組
np.zeros((3, 4))
- 創(chuàng)建一個全1的數(shù)組
np.ones((3, 4))
- 創(chuàng)建一個對角線為1的數(shù)組
np.eye(10)
注:10參數(shù)為10行10列
獲取最大值水由,最小值的位置
np.argmax(t, axis=0)
np.argmin(t, axis=0)
- 注:axis=0荠呐,表示列;axis=1砂客,表示行
numpy生成隨機(jī)數(shù)
參數(shù) | 解釋 |
---|---|
np.random.rand(d0,d1,...dn) | 創(chuàng)建d0到dn維度均勻分布的隨機(jī)數(shù)數(shù)組 |
np.random.randn(d0,d1,...dn) | 創(chuàng)建d0到dn維度正態(tài)分布的隨機(jī)數(shù)數(shù)組 |
np.random.randint(low,high,(shape)) | 生成隨機(jī)整數(shù),low到high是范圍呵恢,size是形狀 |
np.random.uniform(low,high,(size)) | 生成隨機(jī)小數(shù)鞠值,low到high是范圍,size是形狀 |
np.random.seed(s) | 只在第一次生成隨機(jī)數(shù)渗钉,后續(xù)再生成和第一次一樣 |
numpy的注意點copy和view
- a = b,a = b[:]彤恶,復(fù)制钞钙,會相互影響
- a = b.copy(),復(fù)制,a和b互不影響
numpy中的nan和inf
nan:not a number表示不是一個數(shù)字声离,nan是浮點類型
nan出現(xiàn)情況
1.0除0
2.數(shù)據(jù)缺失
3.無窮大減去無窮大芒炼,無窮大加上無窮大inf:infinity,inf表示正無窮术徊,-inf表示負(fù)無窮本刽,inf是浮點類型
inf出現(xiàn)情況
1.一個非0數(shù)字除0注意點:
1.np.nan == np.nan False
2.np.nan != np.nan True
3.np.count_nonzero(t != t) 判斷ndarray中nan個數(shù)
4.np.isnan(t) 判斷ndarray中哪些地方是nan,可以替換為0
5.nan和任何值計算都是nan
6.把nan替換為0不合適赠涮,會降低平均值等子寓,合適的操作時替換為均值nan替換為均值示例代碼
import numpy as np
t1 =np.arange(12).reshape((3,4)).astype("float")
t1[1, 2:4] = np.nan
print(t1)
for i in range(t1.shape[1]):
?temp_col = t1[:, i]
?nan_num = np.count_nonzero(temp_col != temp_col)
?if nan_num != 0:
??# 獲取該列所有值不是nan的array
??temp_not_nan_col = temp_col[temp_col == temp_col]
??# 將temp_not_nan_col的均值賦值給temp_col中值為nan的位置
??temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
print(t1)
numpy中常用統(tǒng)計函數(shù)
函數(shù) | 含義 |
---|---|
np.sum(t,axis=None) | 求和 |
np.mean(t,axis=None) | 均值 |
np.median(t,axis=None) | 中值 |
np.max(t,axis=None) | 最大值 |
np.min(t,axis=None) | 最小值 |
np.ptp(t,axis=None) | 最大值和最小值的差 |
np.std(t,axis=None) | 標(biāo)準(zhǔn)差 |