numpy基本使用

什么是numpy

? 一個在Python中做科學(xué)計算的基礎(chǔ)庫,重在數(shù)值計算,也是大部分PYTHON科學(xué)計算庫的基礎(chǔ)庫,多用于在大型惩妇、多維數(shù)組上執(zhí)行數(shù)值運算。

為什么要學(xué)習(xí)numpy

  1. 快速
  2. 方便
  3. 科學(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ù)組的軸

img

明白了軸的概念之后,對于shape返回的結(jié)果和reshape的結(jié)果能夠更加清楚

三維數(shù)組的軸

img

明白了軸的概念之后葵腹,對于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)該考慮什么?

  1. 我們想要反映出什么樣的結(jié)果,解決什么問題?
  2. 選擇什么樣的呈現(xiàn)方式?
  3. 數(shù)據(jù)還需要做什么樣的處理?
  4. 寫代碼

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é)果

δ = \sqrt{\frac{1}{N}\sum_{i=1}^N(x_i-μ)^2}

標(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é)

  1. 如何選擇一行或者多行的數(shù)據(jù)(列)磕秤?
  2. 如何給選取的行或者列賦值乳乌?
  3. 如何大于把大于10的值替換為10?
  4. np.where如何使用市咆?
  5. np.clip如何使用钦扭?
  6. 如何轉(zhuǎn)置(交換軸)?
  7. 讀取和保存數(shù)據(jù)為csv
  8. np.nan和np.inf是什么
  9. 常用的統(tǒng)計函數(shù)你記得幾個床绪?
  10. 標(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")

img

希望了解英國的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)

img

數(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)

img

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)概率是等可能的

img

? \2. 正態(tài)分布
? 呈鐘型峰弹,兩頭低店量,中間高,左右對

img

numpy的注意點copy和view

  1. a=b 完全不復(fù)制鞠呈,a和b相互影響
  2. a = b[:],視圖的操作融师,一種切片,會創(chuàng)建新的對象a蚁吝,但是a的數(shù)據(jù)完全由b保管旱爆,他們兩個的數(shù)據(jù)變化是一致的。
  3. a = b.copy(),復(fù)制窘茁,a和b互不影響

“人間處處是繁華怀伦,你要全力以赴開花”
Macsen Chu

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市山林,隨后出現(xiàn)的幾起案子房待,更是在濱河造成了極大的恐慌,老刑警劉巖驼抹,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑孩,死亡現(xiàn)場離奇詭異,居然都是意外死亡框冀,警方通過查閱死者的電腦和手機流椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左驾,“玉大人镣隶,你說我怎么就攤上這事极谊」钣遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵轻猖,是天一觀的道長帆吻。 經(jīng)常有香客問我,道長咙边,這世上最難降的妖魔是什么猜煮? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮败许,結(jié)果婚禮上王带,老公的妹妹穿的比我還像新娘。我一直安慰自己市殷,他們只是感情好愕撰,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般搞挣。 火紅的嫁衣襯著肌膚如雪带迟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天囱桨,我揣著相機與錄音仓犬,去河邊找鬼。 笑死舍肠,一個胖子當(dāng)著我的面吹牛搀继,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翠语,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼律歼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啡专?” 一聲冷哼從身側(cè)響起险毁,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎们童,沒想到半個月后畔况,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡慧库,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年跷跪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐板。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吵瞻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甘磨,到底是詐尸還是另有隱情橡羞,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布济舆,位于F島的核電站卿泽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滋觉。R本人自食惡果不足惜签夭,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椎侠。 院中可真熱鬧第租,春花似錦、人聲如沸我纪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至璧诵,卻和暖如春汰蜘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背之宿。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工族操, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人比被。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓色难,卻偏偏與公主長得像,于是被迫代替她去往敵國和親等缀。 傳聞我的和親對象是個殘疾皇子枷莉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353