自學(xué)整理記錄,大神見(jiàn)笑
為什么學(xué)習(xí)numpy
- 快速
- 方便
- 科學(xué)計(jì)算的基礎(chǔ)庫(kù)
什么是numpy
- 一個(gè)在Python中做科學(xué)計(jì)算的基礎(chǔ)庫(kù),重在數(shù)值計(jì)算,也是大部分Python科學(xué)計(jì)算庫(kù)的基礎(chǔ)庫(kù),多用于在大型、多維數(shù)組上執(zhí)行數(shù)值運(yùn)算
- 導(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中的元素?cái)?shù)據(jù)類型
t1 = numpy.arange(3)
t1.dtype
- numpy有特有數(shù)據(jù)類型

- 指定ndarray中的元素?cái)?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第二個(gè)參數(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有返回值,不會(huì)改變?cè)瓉?lái)t1的形狀
注:變成一維數(shù)組傳(24,),24為所有元素的個(gè)數(shù)
將其他形狀數(shù)組展開(kāi)成一維數(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ù)組按對(duì)角線為中心交換數(shù)據(jù)
注:轉(zhuǎn)置有上面三種方法
計(jì)算
t1 = numpy.arange(12).reshape((3, 4)
print(t1 + 2)
print(t1 - 2)
print(t1 * 2)
print(t1 / 2)
- 注:t1中每個(gè)值都會(huì)去計(jì)算加減乘除
- 注: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)
- 注:對(duì)應(yīng)位置的元素做計(jì)算
- 注:維度不同的數(shù)組進(jìn)行計(jì)算,符合廣播原則就可以計(jì)算;沒(méi)有對(duì)應(yīng)就會(huì)報(bào)錯(cuò)ValueError: operands could not be broadcast together with shapes
- 注:廣播原則:如果兩個(gè)數(shù)組的后緣維度的軸長(zhǎng)度相等或其中一方的長(zhǎng)度為1,即認(rèn)為廣播兼容,可以計(jì)算
軸
- 在numpy中使用0,1,2...數(shù)字表示,一維數(shù)組只有一個(gè)0軸;二維數(shù)組(shape(0,0))有0軸和1軸;三維數(shù)組(shape(0,0,0))有0軸和1軸和2軸


numpy讀取數(shù)據(jù)
numpy實(shí)際中不會(huì)用讀取數(shù)據(jù)庫(kù)數(shù)據(jù)功能,因?yàn)閜andas中有更強(qiáng)大的方法是,了解即可
csv文件,逗號(hào)分隔文件,csv文件里所有的數(shù)據(jù)都是用逗號(hào)隔開(kāi)的
讀取
np.loadtxt(frame,dtype="float",delimiter=None,skiprows=0,usecols=None,unpack=False)
| 參數(shù) | 解釋 |
|---|---|
| frame | 路徑 |
| dtype | 元素?cái)?shù)據(jù)類型,默認(rèn)會(huì)把較大的數(shù)據(jù)轉(zhuǎn)化為科學(xué)計(jì)數(shù)的方式 |
| delimiter | 以什么分隔,不指定會(huì)報(bào)錯(cuò) |
| skiprows | 跳過(guò)前x行,一般跳過(guò)第一行表頭 |
| 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]]
- 同時(shí)取單行和單列
t1[2,3]
- 同時(shí)取多行和多列
t1[2:5,1:4]
注:冒號(hào):左閉右開(kāi)
取多個(gè)不相鄰的點(diǎn)
t1[[0,2,3],[0,1,3]]
注:取的是坐標(biāo)(0,0)(2,1)(3,3)三個(gè)點(diǎn)
修改numpy中的數(shù)值
t1[:,2:4] = 0
注:取到對(duì)應(yīng)的行、列、點(diǎn)賦值即可
修改篩選出來(lái)的條件的值
t1[t1 < 10] = 10
注:上面表示所有小于10的點(diǎn)修改為10
numpy中三元運(yùn)算符
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í)行第二句代碼,可能會(huì)報(bào)錯(cuò)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)建一個(gè)全0的數(shù)組
np.zeros((3, 4))
- 創(chuàng)建一個(gè)全1的數(shù)組
np.ones((3, 4))
- 創(chuàng)建一個(gè)對(duì)角線為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的注意點(diǎn)copy和view
- a = b,a = b[:],復(fù)制,會(huì)相互影響
- a = b.copy(),復(fù)制,a和b互不影響
numpy中的nan和inf
nan:not a number表示不是一個(gè)數(shù)字,nan是浮點(diǎn)類型
nan出現(xiàn)情況
1.0除0
2.數(shù)據(jù)缺失
3.無(wú)窮大減去無(wú)窮大,無(wú)窮大加上無(wú)窮大inf:infinity,inf表示正無(wú)窮,-inf表示負(fù)無(wú)窮,inf是浮點(diǎn)類型
inf出現(xiàn)情況
1.一個(gè)非0數(shù)字除0注意點(diǎn):
1.np.nan == np.nan False
2.np.nan != np.nan True
3.np.count_nonzero(t != t) 判斷ndarray中nan個(gè)數(shù)
4.np.isnan(t) 判斷ndarray中哪些地方是nan,可以替換為0
5.nan和任何值計(jì)算都是nan
6.把nan替換為0不合適,會(huì)降低平均值等,合適的操作時(shí)替換為均值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)計(jì)函數(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)差 |