什么是numpy
? 一個在Python中做科學(xué)計算的基礎(chǔ)庫,重在數(shù)值計算,也是大部分PYTHON科學(xué)計算庫的基礎(chǔ)庫,多用于在大型惩妇、多維數(shù)組上執(zhí)行數(shù)值運算。
為什么要學(xué)習(xí)numpy
- 快速
- 方便
- 科學(xué)計算的基礎(chǔ)庫
國際慣例筐乳,以上都是我復(fù)制的屿附,保住了我cv程序員的尊嚴(yán)。
numpy創(chuàng)建數(shù)組(矩陣)
創(chuàng)建數(shù)組
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array(range(1, 6))
# 上面a, b, c內(nèi)容相同哥童,注意arange和range的區(qū)別
c = np.arange(1, 6)
np.arange的用法:arange([start,], stop[, step, ], drype = None)
數(shù)組的類名:
In [1]: import numpy as np
In [2]: a = np.array([1, 2, 3, 4, 5])
In [3]: type(a)
Out[3]: numpy.ndarray
數(shù)據(jù)的類型
In [4]: a.dtype
Out[4]: dtype('int64')
numpy中常見的更多數(shù)據(jù)類型
類型 | 類型代碼 | 說明 |
---|---|---|
int8挺份、uint8 | i1、u1 | 有符號和無符號的8位(1個字節(jié))整型 |
int16贮懈、uint16 | i2匀泊、u2 | 有符號和無符號的8位(2個字節(jié))整型 |
int32、uint32 | i4朵你、u4 | 有符號和無符號的8位(4個字節(jié))整型 |
int64各聘、uint64 | i8、u8 | 有符號和無符號的8位(8個字節(jié))整型 |
float16 | f2 | 半精度浮點數(shù) |
float32 | f4或f | 標(biāo)準(zhǔn)的單精度浮點數(shù)抡医。與C的float兼容 |
float64 | f8或d | 標(biāo)準(zhǔn)的雙精度浮點數(shù)躲因。與C的double和Python的float對象兼容 |
float128 | f16或g | 擴展精度浮點數(shù) |
complex64、complex128忌傻、complex256 | c8大脉、c16、c32 | 分別用兩個32為水孩、64位或128位浮點表示的復(fù)數(shù) |
bool | ? | 存儲True和False值的布爾類型 |
數(shù)據(jù)類型的操作
創(chuàng)建指定的數(shù)據(jù)類型:
In [5]: a = np.array([1, 0, 1, 0], dtype = np.bool) # 或者使用dtype='?'
In [6]: a
Out[6]: array([ True, False, True, False], dtype=bool)
修改數(shù)組的數(shù)據(jù)類型:
In [7]: a.astype("i1") # 或者使用a.astype(np.int8)
Out[7]: array([1, 0, 1, 0], dtype=int8)
修改浮點型的小數(shù)位數(shù)
In [9]: b = np.array([random.random() for i in range(10)])
In [10]: b
Out[10]:
array([ 0.0485436 , 0.26320629, 0.69646413, 0.71811003, 0.3576838 ,
0.58919477, 0.84757749, 0.52428633, 0.486302 , 0.48908838])
In [11]: np.round(b, 2)
Out[11]: array([ 0.05, 0.26, 0.7 , 0.72, 0.36, 0.59, 0.85, 0.52, 0.49, 0.49])
那么問題來了镰矿,Python中如何保留固定位數(shù)的小數(shù)?
round(random.random, 3) # 第二個參數(shù)是保留小數(shù)的位數(shù)
數(shù)組的形狀
In [12]: a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
In [13]: a
Out[13]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
查看數(shù)組的形狀:
In [14]: a.shape
Out[14]: (2, 6)
修改數(shù)組的形狀:
In [15]: a.reshape(3, 4)
Out[15]:
array([[3, 4, 5, 6],
[7, 8, 4, 5],
[6, 7, 8, 9]])
In [16]: a.shape
Out[16]: (2, 6) # 為什么a還是2行6列的數(shù)組呢俘种?
In [17]: b = a.reshape(3, 4)
In [18]: b.shape
Out[18]: (3, 4)
In [19]: b
Out[19]:
array([[3, 4, 5, 6],
[7, 8, 4, 5],
[6, 7, 8, 9]])
在ipython下秤标,調(diào)用了reshape之后立刻輸出了結(jié)果绝淡,說明reshape是有返回值的,一般情況下這種有返回值的方法不會修改源數(shù)據(jù)苍姜。
把數(shù)組轉(zhuǎn)化為1維度數(shù)據(jù)
In [20]: b.reshape(1, 12)
Out[20]: array([[3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9]])
In [21]: b.flatten()
Out[21]: array([3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9])
那有些小伙伴就非常的機智牢酵,我們給他reshape成1行12列的數(shù)組不就得了嗎…仔細(xì)看一下,那是一維數(shù)組嗎衙猪? flatten()方法馍乙,可以把數(shù)組轉(zhuǎn)化為一維數(shù)組。
數(shù)組和數(shù)的計算
In [22]: a
Out[22]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [23]: a + 1
Out[23]:
array([[ 4, 5, 6, 7, 8, 9],
[ 5, 6, 7, 8, 9, 10]])
In [24]: a * 3
Out[24]:
array([[ 9, 12, 15, 18, 21, 24],
[12, 15, 18, 21, 24, 27]])
這是一個nupy的廣播機制造成的屈嗤,在運算過程中潘拨,加減乘除的值被廣播到所有的元素上面
數(shù)組和數(shù)組的計算
In [28]: a
Out[28]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [29]: b
Out[29]:
array([[21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32]])
In [30]: a + b
Out[30]:
array([[24, 26, 28, 30, 32, 34],
[31, 33, 35, 37, 39, 41]])
In [31]: a * b
Out[31]:
array([[ 63, 88, 115, 144, 175, 208],
[108, 140, 174, 210, 248, 288]])
# 不同維度的數(shù)組計算
In [32]: c = np.arange(1, 13).reshape(3, 4)
In [33]: c
Out[33]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
In [34]: a
Out[34]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [35]: a * c
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-35-fc01a05f2628> in <module>()
----> 1 a * c
ValueError: operands could not be broadcast together with shapes (2,6) (3,4)
But5跏洹H暮拧!季蚂!
In [40]: a # 2行6列的數(shù)組
Out[40]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [41]: c # 1行6列的數(shù)組
Out[41]: array([1, 2, 3, 4, 5, 6])
In [42]: a - c
Out[42]:
array([[2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3]])
In [43]: a * c
Out[43]:
array([[ 3, 8, 15, 24, 35, 48],
[ 4, 10, 18, 28, 40, 54]])
In [40]: a # 2行6列的數(shù)組
Out[40]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [41]: c # 1行6列的數(shù)組
Out[41]: array([1, 2, 3, 4, 5, 6])
In [42]: a - c
Out[42]:
array([[2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3]])
In [43]: a * c
Out[43]:
array([[ 3, 8, 15, 24, 35, 48],
[ 4, 10, 18, 28, 40, 54]])
In [45]: a # 2行6列的數(shù)組
Out[45]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [46]: c # 2行1列的數(shù)組
Out[46]:
array([[1],
[2]])
In [47]: c + a # 相加
Out[47]:
array([[ 4, 5, 6, 7, 8, 9],
[ 6, 7, 8, 9, 10, 11]])
In [48]: a * c # 相乘
Out[48]:
array([[ 3, 4, 5, 6, 7, 8],
[ 8, 10, 12, 14, 16, 18]])
In [49]: c * a # 相乘
Out[49]:
array([[ 3, 4, 5, 6, 7, 8],
[ 8, 10, 12, 14, 16, 18]])
Why??
廣播原則
如果兩個數(shù)組的后緣維度(trailing dimension茫船,即從末尾開始算起的維度)的軸長度相符或其中一方的長度為1,則認(rèn)為它們是廣播兼容的扭屁。廣播會在缺失和(或)長度為1的維度上進行算谈。
怎么理解呢?
可以把維度指的是shape所對應(yīng)的數(shù)字個數(shù)
那么問題來了:
shape為(3, 3, 3)的數(shù)組能夠和(3, 2)的數(shù)組進行計算么? No
shape為(3, 3, 2)的數(shù)組能夠和(3, 2)的數(shù)組進行計算么? Yes
有什么好處呢?
舉個例子:每列的數(shù)據(jù)減去列的平均值的結(jié)果
軸(axis)
在numpy中可以理解為方向,使用0, 1, 2…數(shù)字表示,對于一個一維數(shù)組,只有一個0軸,對于2維數(shù)組(shape(2, 2)),有0軸和1軸,對于三維數(shù)組(shape(2, 2, 3)),有0, 1, 2軸。
有了軸的概念之后,我們計算會更加方便,比如計算一個2維數(shù)組的平均值,必須指定是計算哪個方向上面的數(shù)字的平均值料滥。
那么問題來了:
在前面的知識,軸在哪里?
回顧np.arange(0, 10).reshape((2, 5)),reshpe中2表示0軸長度(包含數(shù)據(jù)的條數(shù))為2,1軸長度為5, 2 * 5 一共10個數(shù)據(jù)然眼。
二維數(shù)組的軸
明白了軸的概念之后,對于shape返回的結(jié)果和reshape的結(jié)果能夠更加清楚
三維數(shù)組的軸
明白了軸的概念之后葵腹,對于shape返回的結(jié)果和reshape的結(jié)果能夠更加清楚
numpy讀取數(shù)據(jù)
CSV:Comma-Separated Value,逗號分隔值文件
顯示:表格狀態(tài)
源文件:換行和逗號分隔行列的格式化文本,每一行的數(shù)據(jù)表示一條記錄
? 由于csv便于展示高每,讀取和寫入,所以很多地方也是用csv的格式存儲和傳輸中小型的數(shù)據(jù)践宴,不過讀取數(shù)據(jù)庫也是很方便的鲸匿。
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
參數(shù) | 解釋 |
---|---|
frame | 文件、字符串或產(chǎn)生器阻肩,可以是.gz或bz2壓縮文件 |
dtype | 數(shù)據(jù)類型带欢,可選,CSV的字符串以什么數(shù)據(jù)類型讀入數(shù)組中烤惊, |
delimiter | 分隔字符串乔煞,默認(rèn)是任何空格、改為 逗號 |
skiprows | 跳過前x行柒室,一般跳過第一行表頭 |
usecols | 讀取指定的列瘤缩,索引,元祖類型 |
unpack | 如果True伦泥,讀入屬性將分別寫入不同數(shù)組變量剥啤,F(xiàn)alse讀入數(shù)據(jù)只寫入一個數(shù)組變量锦溪,默認(rèn)False |
現(xiàn)在這里有一個英國和美國各自youtube1000多個視頻的點擊,喜歡,不喜歡,評論數(shù)量([“views”, “l(fā)ikes”, “dislikes”, “comment_total”])的csv,我們嘗試來對其進行操作
import numpy as np
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
# t1 = np.loadtxt(us_file_path, delimiter=",", dtype="int", unpack=True)
t2 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
#
# print(t1)
print(t2)
print("*" * 100)
# 取行
print(t2[2])
# 取連續(xù)多行
print(t2[2:])
# 取不連續(xù)的多行
print(t2[[2, 8, 10]])
# 取列
print(t2[1,:])
print(t2[[2,10,3],:])
print(t2[:, 0])
# 連續(xù)的多列
print(t2[:,2:])
# 取不連續(xù)多列
print(t2[:, [0, 2]])
# 取多行和多列府怯,取第3行刻诊,第4列的值
print(t2[2, 3])
# 取多個不相鄰的點
c = t2[[0, 2, 2], [0, 1, 3]]
print(c)
注意其中添加delimiter和dtype以及unpack的效果
delimiter:指定邊界符號是什么,不指定會導(dǎo)致每行數(shù)據(jù)為一個整體的字符串二報錯
dtype:默認(rèn)情況下對于較大的數(shù)據(jù)會將其變?yōu)榭茖W(xué)計數(shù)法
那么unpack的效果呢?
unpack:
默認(rèn)是False(0),默認(rèn)情況下匪燕,有多少條數(shù)據(jù)美旧,就會有多少行。
為True(1)的情況下歪架,每一列的數(shù)據(jù)會組成一行,原始數(shù)據(jù)有多少列,加載出來的數(shù)據(jù)就會有多少行相當(dāng)于轉(zhuǎn)置的效果档礁。
那么問題來了:什么是轉(zhuǎn)置?(這個線性代數(shù)里學(xué)過)
轉(zhuǎn)置是一種變換吝沫,對于numpy中的數(shù)組來說呻澜,就是在對角線方向交換數(shù)據(jù),目的也是為了更方便的去處理數(shù)據(jù)惨险。
In [51]: t = np.arange(0, 18).reshape(3, 6)
In [52]: t
Out[52]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
In [53]: t.transpose()
Out[53]:
array([[ 0, 6, 12],
[ 1, 7, 13],
[ 2, 8, 14],
[ 3, 9, 15],
[ 4, 10, 16],
[ 5, 11, 17]])
In [54]: t.swapaxes(1, 0)
Out[54]:
array([[ 0, 6, 12],
[ 1, 7, 13],
[ 2, 8, 14],
[ 3, 9, 15],
[ 4, 10, 16],
[ 5, 11, 17]])
In [55]: t.T
Out[55]:
array([[ 0, 6, 12],
[ 1, 7, 13],
[ 2, 8, 14],
[ 3, 9, 15],
[ 4, 10, 16],
[ 5, 11, 17]])
以上的三種方法都可以實現(xiàn)二維數(shù)組的轉(zhuǎn)置的效果羹幸,大家能夠看出來,轉(zhuǎn)置和交換軸的效果一樣
那么辫愉,結(jié)合之前所學(xué)的matplotlib把英國和美國的數(shù)據(jù)呈現(xiàn)出來栅受?
看到這個問題,我們應(yīng)該考慮什么?
- 我們想要反映出什么樣的結(jié)果,解決什么問題?
- 選擇什么樣的呈現(xiàn)方式?
- 數(shù)據(jù)還需要做什么樣的處理?
- 寫代碼
numpy索引和切片
對于剛剛加載出來的數(shù)據(jù),我如果只想選擇其中的某一列(行)我們應(yīng)該怎么做呢恭朗?
其實操作很簡單屏镊,和python中列表的操作一樣
In [57]: a = np.arange(0, 12).reshape(3, 4)
In [58]: a[1]
Out[58]: array([4, 5, 6, 7])
In [59]: a[:,2] # 取一列
Out[59]: array([ 2, 6, 10])
In [60]: a[1:3] # 取多行
Out[60]:
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [61]: a[:,2:4] # 取多列 ,前面放行 ,后面放列
Out[61]:
array([[ 2, 3],
[ 6, 7],
[10, 11]])
numpy中數(shù)值的修改
In [63]: t = np.arange(0, 24).reshape(4, 6)
In [64]: t
Out[64]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [65]: t[:, 2:4]
Out[65]:
array([[ 2, 3],
[ 8, 9],
[14, 15],
[20, 21]])
In [66]: t[:,2:4] = 0
In [67]: t
Out[67]:
array([[ 0, 1, 0, 0, 4, 5],
[ 6, 7, 0, 0, 10, 11],
[12, 13, 0, 0, 16, 17],
[18, 19, 0, 0, 22, 23]])
修改行列的值,我們能夠很容易的實現(xiàn)冀墨,但是如果條件更復(fù)雜呢闸衫?
比如我們想要把t中小于10的數(shù)字替換為3
numpy中布爾索引
In [67]: t
Out[67]:
array([[ 0, 1, 0, 0, 4, 5],
[ 6, 7, 0, 0, 10, 11],
[12, 13, 0, 0, 16, 17],
[18, 19, 0, 0, 22, 23]])
In [68]: t < 10
Out[68]:
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, True, True, False, False],
[False, False, True, True, False, False]], dtype=bool)
In [69]:
In [69]: t[t < 10] = 0
In [70]: t
Out[70]:
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 10, 11],
[12, 13, 0, 0, 16, 17],
[18, 19, 0, 0, 22, 23]])
那么問題來了:
如果我們想把t中小于10的數(shù)字替換為0,把大于10的替換為10诽嘉,應(yīng)該怎么做蔚出??
numpy中三元運算符
In [71]: t = np.arange(24).reshape((4, 6))
In [72]: t
Out[72]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [73]: np.where(t < 10, 0, 10) # numpy的三元運算符
Out[73]:
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 10, 10],
[10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 10]])
那么問題又來了:
如果我們想把t中小于10的數(shù)字替換為0虫腋,把大于20的替換為20骄酗,應(yīng)該怎么做?悦冀?
numpy中的clip(裁剪)
In [92]: t
Out[92]:
array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.],
[ 12., 13., 14., 15., 16., 17.],
[ 18., 19., 20., nan, nan, nan]])
In [93]: t.clip(10, 18)
Out[93]:
array([[ 10., 10., 10., 10., 10., 10.],
[ 10., 10., 10., 10., 10., 11.],
[ 12., 13., 14., 15., 16., 17.],
[ 18., 18., 18., nan, nan, nan]])
觀察左邊的操作:
小于10的替換為10趋翻,大于18的替換為了18,但是nan沒有被替換盒蟆,那么nan是什么踏烙?
numpy中的nan和inf
nan(NAN, Nan) : not a number表示不是一個數(shù)字
什么時候numpy中會出現(xiàn)nan:
當(dāng)我們讀取本地的文件為float的時候师骗,如果有缺失,就會出現(xiàn)nan
當(dāng)做了一個不合適的計算的時候(比如無窮大(inf)減去無窮大)
inf(-inf, inf) : infinity, inf表示正無窮讨惩,-inf表示負(fù)無窮
什么時候回出現(xiàn)inf包括(-inf辟癌,+inf)
比如一個數(shù)字除以0,(python中直接會報錯荐捻,numpy中是一個inf或者-inf)
那么如何指定一個nan或者inf呢黍少?
注意他們的type類型
In [94]: a = np.inf
In [95]: type(a)
Out[95]: float
In [96]: a = np.nan
In [97]: type(a)
Out[97]: float
numpy中的nan的注意點
# 兩個nan是不相等的
In [98]: np.nan == np.nan
Out[98]: False
# np.nan != np.nan
In [99]: np.nan != np.nan
Out[99]: True
# 利用以上的特性,判斷數(shù)組中的nan的個數(shù)
In [101]: t = np.array([1., 2., np.nan])
In [102]: t
Out[102]: array([ 1., 2., nan])
In [103]: np.count_nonzero(t != t)
Out[103]: 1
# 由于np.nan != np.nan处面,那么如何判斷一個數(shù)字是否為nan呢厂置?
# 通過np.isnan(a)來判斷,返回bool類型魂角,比如希望吧nan替換為0
In [104]: t
Out[104]: array([ 1., 2., nan])
In [105]: t[np.isnan(t)] = 0
# nan和任何值計算都為nan
In [106]: t
Out[106]: array([ 1., 2., 0.])
那么問題又雙來了昵济,在一組數(shù)據(jù)中單純的把nan替換為0,合適么或颊?會帶來什么樣的影響砸紊?
比如传于,全部替換為0后囱挑,替換之前的平均值如果大于0,替換之后的均值肯定會變小沼溜,所以更一般的方式是把缺失的數(shù)值替換為均值(中值)或者是直接刪除有缺失值的一行
那么又雙叒問題來了:
如何計算一組數(shù)據(jù)的中值或者是均值
如何刪除有缺失數(shù)據(jù)的那一行(列)[過兩天在pandas中再介紹吧]
numpy中常用統(tǒng)計函數(shù)
- 求和:t.sum(axis=None)
- 均值:t.mean(a,axis=None) 受離群點的影響較大
- 中值:np.median(t,axis=None)
- 最大值:t.max(axis=None)
- 最小值:t.min(axis=None)
- 極值:np.ptp(t,axis=None) 即最大值和最小值只差
- 標(biāo)準(zhǔn)差:t.std(axis=None)
默認(rèn)返回多維數(shù)組的全部的統(tǒng)計結(jié)果平挑,如果指定axis則返回一個當(dāng)前軸上的結(jié)果
標(biāo)準(zhǔn)差是一組數(shù)據(jù)平均值分散程度的一種度量。
一個較大的標(biāo)準(zhǔn)差系草,代表大部分?jǐn)?shù)值和其平均值之間差異較大通熄;
一個較小的標(biāo)準(zhǔn)差,代表這些數(shù)值較接近平均值找都。
反映出數(shù)據(jù)的波動穩(wěn)定情況唇辨,越大表示波動越大,越不穩(wěn)定能耻。
import numpy as np
def fill_nadarray(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:
temp_not_nan_col = temp_col[temp_col == temp_col] # 當(dāng)前一列不為nan的array
temp_not_nan_col.mean()
# 選中當(dāng)前nan的位置赏枚,把值、賦值為不為nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(12).reshape((3, 4)).astype("float")
t1[1, 2:] = np.nan
print(t1)
t1 = fill_nadarray(t1)
print(t1)
運行結(jié)果
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
ndarry缺失值填充均值
t中存在nan值晓猛,如何操作把其中的nan填充為每一列的均值
import numpy as np
def fill_nadarray(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:
temp_not_nan_col = temp_col[temp_col == temp_col] # 當(dāng)前一列不為nan的array
temp_not_nan_col.mean()
# 選中當(dāng)前nan的位置饿幅,把值、賦值為不為nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(12).reshape((3, 4)).astype("float")
t1[1, 2:] = np.nan
print(t1)
t1 = fill_nadarray(t1)
print(t1)
麻煩嗎戒职?其實……在pandas中我們有更簡單的方法處理缺失值栗恩,別著急,早進城晚進城洪燥,早晚都進城
小結(jié)
- 如何選擇一行或者多行的數(shù)據(jù)(列)磕秤?
- 如何給選取的行或者列賦值乳乌?
- 如何大于把大于10的值替換為10?
- np.where如何使用市咆?
- np.clip如何使用钦扭?
- 如何轉(zhuǎn)置(交換軸)?
- 讀取和保存數(shù)據(jù)為csv
- np.nan和np.inf是什么
- 常用的統(tǒng)計函數(shù)你記得幾個床绪?
- 標(biāo)準(zhǔn)差反映出數(shù)據(jù)的什么信息
動手
英國和美國各自youtube1000的數(shù)據(jù)結(jié)合之前的matplotlib繪制出各自的評論數(shù)量的直方圖
import numpy as np
from matplotlib import pyplot as plt
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
t_us = np.loadtxt(us_file_path, delimiter=",", dtype="int")
# 取評論的數(shù)據(jù)
t_us_comments = t_us[:, -1]
# 選擇比5000小的數(shù)據(jù)
t_us_comments = t_us_comments[t_us_comments <= 5000]
print(t_us_comments.max(), t_us_comments.min())
d = 50
bin_nums = (t_us_comments.max() - t_us_comments.min()) // d
# 繪圖
plt.figure(figsize=(20, 8), dpi=80)
plt.hist(t_us_comments, bin_nums)
plt.savefig("./t1.png")
希望了解英國的youtube中視頻的評論數(shù)和喜歡數(shù)的關(guān)系客情,應(yīng)該如何繪制改圖
import numpy as np
us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"
# 加載國家數(shù)據(jù)
us_data = np.loadtxt(us_data, delimiter=",", dtype="int")
uk_data = np.loadtxt(uk_data, delimiter=",", dtype="int")
# 添加國家信息
# 構(gòu)造全為0的數(shù)據(jù)
zeros_data = np.zeros((us_data.shape[0], 1)).astype(int)
ones_data = np.ones((uk_data.shape[0], 1)).astype(int)
# 分別添加一列全為0,1的數(shù)組
us_data = np.hstack((us_data, zeros_data))
uk_data = np.hstack((uk_data, ones_data))
# 拼接兩組數(shù)據(jù)
final_data = np.vstack((us_data, uk_data))
print(final_data)
數(shù)組的拼接
現(xiàn)在我希望把之前案例中兩個國家的數(shù)據(jù)方法一起來研究分析癞己,那么應(yīng)該怎么做膀斋?
In [111]: t1
Out[111]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
In [112]: t2
Out[112]:
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [113]: np.vstack((t1, t2)) # 豎直拼接(vertically)
Out[113]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [114]: np.hstack((t1, t2)) # 水平拼接(horizontally)
Out[114]:
array([[ 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
[ 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])
數(shù)組的行列交換
數(shù)組水平或者豎直拼接很簡單,但是拼接之前應(yīng)該注意什么痹雅?
豎直拼接的時候:每一列代表的意義相同Q龅!!绩社!否則牛頭不對馬嘴(還是驢唇不對馬嘴來著?)
如果每一列的意義不同摔蓝,這個時候應(yīng)該交換某一組的數(shù)的列,讓其和另外一類相同
那么問題來了愉耙?
如何交換某個數(shù)組的行或者列呢贮尉?
In [115]: t = np.arange(12, 24).reshape(3, 4)
In [116]: t
Out[116]:
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
In [118]: t[[1, 2], :] = t[[2, 1], :] # 行交換
In [119]: t
Out[119]:
array([[12, 13, 14, 15],
[20, 21, 22, 23],
[16, 17, 18, 19]])
In [120]: t[:, [0, 2]] = t[:, [2, 0]] # 列交換
In [121]: t
Out[121]:
array([[14, 13, 12, 15],
[22, 21, 20, 23],
[18, 17, 16, 19]])
現(xiàn)在希望把之前案例中兩個國家的數(shù)據(jù)方法一起來研究分析,同時保留國家的信息(每條數(shù)據(jù)的國家來源)朴沿,應(yīng)該怎么辦猜谚?
import numpy as np
us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"
# 加載國家數(shù)據(jù)
us_data = np.loadtxt(us_data, delimiter=",", dtype="int")
uk_data = np.loadtxt(uk_data, delimiter=",", dtype="int")
# 添加國家信息
# 構(gòu)造全為0的數(shù)據(jù)
zeros_data = np.zeros((us_data.shape[0], 1)).astype(int)
ones_data = np.ones((uk_data.shape[0], 1)).astype(int)
# 分別添加一列全為0,1的數(shù)組
us_data = np.hstack((us_data, zeros_data))
uk_data = np.hstack((uk_data, ones_data))
# 拼接兩組數(shù)據(jù)
final_data = np.vstack((us_data, uk_data))
print(final_data)
numpy更多好用的方法
獲取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)創(chuàng)建一個全0的數(shù)組: np.zeros((3,4))
創(chuàng)建一個全1的數(shù)組:np.ones((3,4))
創(chuàng)建一個對角線為1的正方形數(shù)組(方陣):np.eye(3)
numpy生成隨機數(shù)
參數(shù) | 解釋 |
---|---|
.rand(d0, d1, ..dn) | 創(chuàng)建d0-dn維度的均勻分布的隨機數(shù)數(shù)組赌渣,浮點數(shù)魏铅,范圍從0·1 |
.rand(d0, d1, ..dn) | 創(chuàng)建d0-dn維度的標(biāo)準(zhǔn)正態(tài)分布隨機數(shù),浮點數(shù)坚芜,平均數(shù)0览芳,標(biāo)準(zhǔn)差1 |
.randint(low, high, (shape)) | 從給定上下限范圍選取隨機數(shù)整數(shù),范圍是low, high, 形狀是shape |
.uniform(low, high, (size)) | 產(chǎn)生具有均勻分布的數(shù)組鸿竖,low起始值沧竟,high結(jié)束值,size形狀 |
.normal(loc, scale, (size)) | 從指定正態(tài)分布中隨機抽取樣本千贯,分布中心是loc(概率分布的均值)屯仗,標(biāo)準(zhǔn)差是scale,形狀是size |
.seed(s) | 隨機數(shù)種子搔谴,s是給定的種子值魁袜。因為計算機生成的是偽隨機數(shù),所以通過設(shè)定相同的隨機數(shù)種子,可以每次生成相同的的隨機數(shù) |
import numpy as np
np.random.seed(10)
t = np.random.randint(0, 20, (3, 4))
print(t)
# 運行結(jié)果
[[ 9 4 15 0]
[17 16 17 8]
[ 9 0 10 8]]
分布的補充
1.均勻分布
在相同的大小范圍內(nèi)的出現(xiàn)概率是等可能的
? \2. 正態(tài)分布
? 呈鐘型峰弹,兩頭低店量,中間高,左右對
numpy的注意點copy和view
- a=b 完全不復(fù)制鞠呈,a和b相互影響
- a = b[:],視圖的操作融师,一種切片,會創(chuàng)建新的對象a蚁吝,但是a的數(shù)據(jù)完全由b保管旱爆,他們兩個的數(shù)據(jù)變化是一致的。
- a = b.copy(),復(fù)制窘茁,a和b互不影響
“人間處處是繁華怀伦,你要全力以赴開花”
Macsen Chu