大家好呀,今天我們學(xué)習(xí) Python 的一個(gè)科學(xué)計(jì)算庫 NumPy蝶锋,它是用 Python 做數(shù)據(jù)分析所必不可少的一個(gè)第三方庫雁佳。
本節(jié)課的主要內(nèi)容有:
- NumPy認(rèn)知
(1)NumPy介紹
(2)為什么要學(xué)NumPy
(3)NumPy的優(yōu)勢
(4)ndarray與Python原生list運(yùn)算效率對比 - NumPy 的Ndarray 對象
(1)創(chuàng)建一維數(shù)組
(2)創(chuàng)建二維數(shù)組
(3)常用屬性
(4)調(diào)整數(shù)組的形狀
(5) 將數(shù)組轉(zhuǎn)成list
(6)NumPy的數(shù)據(jù)類型
(7)數(shù)組的索引和切片
(8)數(shù)組中的數(shù)值修改 - 數(shù)組中的軸
- 數(shù)組的計(jì)算
(1)數(shù)組和數(shù)的計(jì)算
(2)數(shù)組與數(shù)組之間的操作
(3)NumPy的計(jì)算方法 - 數(shù)組操作
(1)數(shù)組添加缸废、刪除和去重
(2)數(shù)組的拼接
(3)數(shù)組的分割 - 數(shù)組中
nan
和inf
- 二維數(shù)組的轉(zhuǎn)置
課前準(zhǔn)備
安裝 Numpy
pip install -U numpy -i https://pypi.douban.com/simple
一、NumPy 認(rèn)知
1咱扣、NumPy 介紹
NumPy(Numerical Python)是一個(gè)開源的 Python 科學(xué)計(jì)算庫绽淘,用于快速處理任意維度的數(shù)組。
NumPy 支持常見的數(shù)組和矩陣操作闹伪,它使用 ndarray 對象來處理多維數(shù)組沪铭,該對象是一個(gè)快速而靈活的大數(shù)據(jù)容器。
2偏瓤、為什么要學(xué) NumPy
- 快速
- 方便
- 科學(xué)計(jì)算的基礎(chǔ)庫
3伦意、NumPy 的優(yōu)勢
- 對于同樣的數(shù)值計(jì)算任務(wù),使用 NumPy 要比直接編寫 Python 代碼便捷得多硼补;
- NumPy 中的數(shù)組的存儲(chǔ)效率和輸入輸出性能均遠(yuǎn)遠(yuǎn)優(yōu)于 Python 中等價(jià)的基本數(shù)據(jù)結(jié)構(gòu)驮肉,且其能夠提升的性能是與數(shù)組中的元素成比例的;
- NumPy 的大部分代碼都是用 C 語言寫的已骇,其底層算法在設(shè)計(jì)時(shí)就有著優(yōu)異的性能离钝,這使得 NumPy 比純 Python 代碼高效得多票编;
4、ndarray 與 Python 原生 list 運(yùn)算效率對比
import random
import time
import numpy as np
a = []
for i in range(100000000):
a.append(random.random())
t1 = time.time()
sum1=sum(a)
t2=time.time()
b=np.array(a)
t4=time.time()
sum3=np.sum(b)
t5=time.time()
print(t2-t1, t5-t4)
t2-t1 為使用 python 自帶的求和函數(shù)消耗的時(shí)間卵渴,t5-t4 為使用
numpy
求和消耗的時(shí)間慧域,結(jié)果為:
從中我們看到 ndarray 的計(jì)算速度要快很多,節(jié)約了時(shí)間浪读。
二昔榴、NumPy 的 Ndarray 對象
NumPy 最重要的一個(gè)特點(diǎn)是其 N 維數(shù)組對象 ndarray
,它是一系列同類型數(shù)據(jù)的集合碘橘,以 0 下標(biāo)為開始進(jìn)行集合中元素的索引互订。ndarray 對象是用于存放同類型元素的多維數(shù)組。
1痘拆、創(chuàng)建一維數(shù)組
import numpy as np
list1 = [1,2,3,4]
oneArray = np.array(list1)
print(type(oneArray))
print(oneArray)
# 創(chuàng)建數(shù)組的多種形式
# 1. 直接傳入列表的方式
t1 = np.array([1,2,3])
print(t1)
print(type(t1))
'''
[1 2 3]
<class 'numpy.ndarray'>
'''
# 2. 傳入range生成序列
t2 = np.array(range(10))
print(t2)
print(type(t2))
'''
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
'''
# 3. 使用 numpy 自帶的 np.arange() 生成數(shù)組
t3 = np.arange(0,10,2)
print(t3)
print(type(t3))
'''
[0 2 4 6 8]
<class 'numpy.ndarray'> '''
2仰禽、創(chuàng)建二維數(shù)組
import numpy as np
list2 = [[1,2],[3,4],[5,6]]
twoArray = np.array(list2)
print(twoArray)
'''
[[1 2]
[3 4]
[5 6]]
'''
3、常用屬性
list2 = [[1,2],[3,4],[5,6]]
twoArray = np.array(list2)
# 獲取數(shù)組的維度( 注意: 與函數(shù)的參數(shù)很像)
print(twoArray.ndim)
'''2'''
# 形狀(行纺蛆,列)
print(twoArray.shape)
'''(3, 2)'''
# 有多少個(gè)元素
print(twoArray.size)
'''6'''
4吐葵、調(diào)整數(shù)組的形狀
four = np.array([[1,2,3],[4,5,6]])
# 修改的是原有的
four.shape = (3,2)
print(four)
# 返回一個(gè)新的數(shù)組
four_other = np.array([[1,2,3],[4,5,6]])
four_other_new = four.reshape(3,2)
print(four_other) print(four_other_new)
# 將多維變成一維數(shù)組
five = four.reshape((6,),order='F')
# 默認(rèn)情況下‘C’以行為主的順序展開,‘F’(Fortran風(fēng)格)意味著以列的順序展開
six = four.flatten(order='C')
print(five)
print(six)
# 拓展:數(shù)組的形狀
t = np.arange(24)
print(t)
print(t.shape)
# 轉(zhuǎn)換成二維
t1 = t.reshape((4,6))
print(t1)
print(t1.shape)
# 轉(zhuǎn)成三維
t2 = t.reshape((2,3,4))
print(t2)
print(t2.shape)
5桥氏、將數(shù)組轉(zhuǎn)成list
# 將數(shù)組轉(zhuǎn)成list
a= np.array([9, 12, 88, 14, 25])
list_a = a.tolist()
print(list_a)
print(type(list_a))
6温峭、NumPy 的數(shù)據(jù)類型
f = np.array([1,2,3,4,5], dtype = np.int16)
# 返回?cái)?shù)組中每個(gè)元素的字節(jié)單位長度
print(f.itemsize)
# 獲取數(shù)據(jù)類型
print(f.dtype)
# 調(diào)整數(shù)據(jù)類型
f1 = f.astype(np.int64)
print(f1.dtype)
# 拓展隨機(jī)生成小數(shù)
# 使用python語法,保留兩位
print(round(random.random(),2))
arr = np.array([random.random() for i in range(10)])
# 取小數(shù)點(diǎn)后兩位
print(np.round(arr,2))
** dtype
是 numpy.dtype
類型字支,先看看對于數(shù)組來說都有哪些類型:**
名稱 | 描述 | 簡寫 |
---|---|---|
np.bool | 用一個(gè)字節(jié)存儲(chǔ)的布爾類型(True或False) | 'b' |
np.int8 | 一個(gè)字節(jié)大小诚镰,-128 至 127 (一個(gè)字節(jié)) | 'i' |
np.int16 | 整數(shù),-32768 至 32767 (2個(gè)字節(jié)) | 'i2' |
np.int32 | 整數(shù)祥款,-2 31 至 2 32 -1 (4個(gè)字節(jié)) | 'i4' |
np.int64 | 整數(shù)清笨,-2 63 至 2 63 - 1 (8個(gè)字節(jié)) | 'i8' |
np.uint8 | 無符號整數(shù),0 至 255 | 'u' |
np.uint16 | 無符號整數(shù)刃跛,0 至 65535 | 'u2' |
np.uint32 | 無符號整數(shù)抠艾,0 至 2 ** 32 - 1 | 'u4' |
np.uint64 | 無符號整數(shù),0 至 2 ** 64 - 1 | 'u8' |
np.?oat16 | 半精度浮點(diǎn)數(shù):16位桨昙,正負(fù)號1位检号,指數(shù)5位,精度10位 | 'f2' |
np.?oat32 | 單精度浮點(diǎn)數(shù):32位蛙酪,正負(fù)號1位齐苛,指數(shù)8位,精度23位 | 'f4' |
np.?oat64 | 雙精度浮點(diǎn)數(shù):64位桂塞,正負(fù)號1位凹蜂,指數(shù)11位,精度52位 | 'f8' |
np.complex64 | 復(fù)數(shù),分別用兩個(gè)32位浮點(diǎn)數(shù)表示實(shí)部和虛部 | 'c8' |
np.complex128 | 復(fù)數(shù)玛痊,分別用兩個(gè)64位浮點(diǎn)數(shù)表示實(shí)部和虛部 | 'c16' |
np.object_ | python對象 | 'O' |
np.string_ | 字符串 | 'S' |
np.unicode_ | unicode類型 | 'U' |
7汰瘫、數(shù)組的索引和切片
(1)一維數(shù)組的操作方法
import numpy as np
a = np.arange(10)
# 冒號分隔切片參數(shù) start:stop:step 來進(jìn)行切片操作
print(a[2:7:2])
# 從索引 2 開始到索引 7 停止,間隔為 2
# 如果只放置一個(gè)參數(shù)擂煞,如 [2]混弥,將返回與該索引相對應(yīng)的單個(gè)元素print(a[2],a)
# 如果為 [2:],表示從該索引開始以后的所有項(xiàng)都將被提取
print(a[2:])
(2)多維數(shù)組的操作方法
import numpy as np
t1 = np.arange(24).reshape(4,6)
print(t1)
print('*'*20)
print(t1[1]) # 取一行(一行代表是一條數(shù)據(jù)对省,索引也是從0開始的) print(t1[1,:]) # 取一行
print(t1[1:])# 取連續(xù)的多行
print(t1[1:3,:])# 取連續(xù)的多行
print(t1[[0,2,3]])# 取不連續(xù)的多行
print(t1[[0,2,3],:])# 取不連續(xù)的多行
print(t1[:,1])# 取一列
print(t1[:,1:])# 連續(xù)的多列print(t1[:,[0,2,3]])# 取不連續(xù)的多列print(t1[2,3])# # 取某一個(gè)值,三行四列
print(t1[[0,1,1],[0,1,3]])# 取多個(gè)不連續(xù)的值蝗拿,[[行,行蒿涎。哀托。。],[列同仆,列。裙品。俗批。]]
8、數(shù)組中的數(shù)值修改
t = np.arange(24).reshape(4,6)
# 修改某一行的值
t[1,:]=0
# 修改某一列的值
t[:,1]=0
# 修改連續(xù)多行
t[1:3,:]=0
# 修改連續(xù)多列
t[:,1:4]=0
# 修改多行多列市怎,取第二行到第四行岁忘,第三列到第五列
t[1:4,2:5]=0
# 修改多個(gè)不相鄰的點(diǎn)
t[[0,1],[0,3]]=0
# 可以根據(jù)條件修改,比如講小于10的值改掉
t[t<10]=0
# 使用邏輯判斷
# np.logical_and &
# np.logical_or |
# np.logical_not ~
t[(t>2)&(t<6)]=0 # 與
t[(t<2)|(t>6)]=0 # 或
t[~(t>6)]=0 # 非
print(t)
# 拓展
# 三目運(yùn)算( np.where(condition, x, y)滿足條件(condition)区匠,輸出x干像,不滿足輸出y。))
score = np.array([[80,88],[82,81],[75,81]])
result = np.where(score>80,True,False)
print(result)
三驰弄、數(shù)組中的軸
1麻汰、什么是軸?
在 Numpy 中可以理解為方向戚篙,使用 0五鲫,1,2 數(shù)字表示岔擂,對于一個(gè)一維數(shù)組位喂,只有一個(gè) 0 軸,
對于 2 維數(shù)組(shape(2, 2)) 有 0 軸和 1 軸乱灵,
對于3維數(shù)組(shape(2, 2, 3))有 0塑崖,1,2 軸
2痛倚、為什么要學(xué)習(xí)軸规婆?
有了軸的概念后,我們計(jì)算會(huì)更加方便,比如計(jì)算一個(gè) 2 維數(shù)組的平均值聋呢,必須指定是計(jì)算哪個(gè)方向上面的數(shù)字的平均值苗踪。
三維數(shù)組中:
在計(jì)算的時(shí)候可以想象成是每一個(gè)坐標(biāo)軸,分別計(jì)算這個(gè)軸上面的每一個(gè)刻度上的值削锰,或者在二維數(shù)組中記住1表示列通铲,0表示行。
四器贩、數(shù)組的計(jì)算
1颅夺、數(shù)組和數(shù)的計(jì)算
由于 numpy 的廣播機(jī)機(jī)制在運(yùn)算過程中,加減乘除的值被廣播到所有的元素上面蛹稍。
t1 = np.arange(24).reshape((6,4))
print(t1+2)
print(t1*2)
print(t1/2)
2吧黄、數(shù)組與數(shù)組之間的操作
同種形狀的數(shù)組(對應(yīng)位置進(jìn)行計(jì)算操作):
t1 = np.arange(24).reshape((6,4))
t2 = np.arange(100,124).reshape((6,4))
print(t1+t2)
print(t1*t2)
不種形狀的多維數(shù)組不能計(jì)算:
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(18).reshape((3,6))
print(t1)
print(t2)
print(t1-t2)
'''
ValueError: operands could not be broadcast together with shapes (4,6) (3,6) '''
行數(shù)或者列數(shù)相同的一維數(shù)組和多維數(shù)組可以進(jìn)行計(jì)算。
行形狀相同(會(huì)與每一行數(shù)組的對應(yīng)位相操作):
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(0,6)
print(t1-t2)
列形狀相同(會(huì)與每一個(gè)相同維度的數(shù)組的對應(yīng)位相操作):
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(4).reshape((4,1))
print(t1-t2)
3唆姐、NumPy 的計(jì)算方法
import numpy as np
score = np.array([[80,88],[82,81],[75,81]])
# 1. 獲取所有數(shù)據(jù)最大值
result = np.max(score)
# 2. 獲取某一個(gè)軸上的數(shù)據(jù)最大值
result = np.max(score,axis=0)
# 3. 獲取最小值
result = np.min(score)
# 4. 獲取某一個(gè)軸上的數(shù)據(jù)最小值
result = np.min(score,axis=0)
# 5. 數(shù)據(jù)的比較
result = np.maximum([-2, -1, 0, 1, 2], 0) # 第一個(gè)參數(shù)中的每一個(gè)數(shù)與第二個(gè)參數(shù)比較返回大的
result = np.minimum([-2, -1, 0, 1, 2], 0) # 第一個(gè)參數(shù)中的每一個(gè)數(shù)與第二個(gè)參數(shù)比較返回小的
result = np.maximum([-2, -1, 0, 1, 2], [1,2,3,4,5]) # 接受的兩個(gè)參數(shù)拗慨,也可以大小一致; 第二個(gè)參數(shù)只是一個(gè)單獨(dú)的值時(shí),其實(shí)是用到了維度的廣播機(jī)制奉芦;
# 6. 求平均值
result = np.mean(score) # 獲取所有數(shù)據(jù)的平均值
result = np.mean(score,axis=0) # 獲取某一行或者某一列的平均值
# 7. 返回給定axis上的累計(jì)和
arr = np.array([[1,2,3], [4,5,6]])
print(arr)
print(arr.cumsum(0))
# 8. argmin求最小值索引
result = np.argmin(score,axis=0)
print(result)
# 9. 求每一列的標(biāo)準(zhǔn)差
# 標(biāo)準(zhǔn)差是一組數(shù)據(jù)平均值分散程度的一種度量赵抢。一個(gè)較大的標(biāo)準(zhǔn)差,代表大部分?jǐn)?shù)值和其平均值之間差異較大声功;
# 一個(gè)較小的標(biāo)準(zhǔn)差烦却,代表這些數(shù)據(jù)較接近平均值反應(yīng)出數(shù)據(jù)的波動(dòng)穩(wěn)定情況,越大表示波動(dòng)越大先巴,越不穩(wěn)定其爵。
result = np.std(score,axis=0)
print(result)
# 10. 極值
# np.ptp(t,axis=None) 就是最大值和最小值的差
# 拓展:方差var, 協(xié)方差cov, 計(jì)算平均值 average, 計(jì)算中位數(shù) median
通用函數(shù):
numpy.sqrt(array) | 平方根函數(shù) |
---|---|
numpy.exp(array) | e^array[i]的數(shù)組 |
numpy.abs/fabs(array) | 計(jì)算絕對值 |
numpy.square(array) | 計(jì)算各元素的平方 等于 array**2 |
numpy.log/log10/log2(array) | 計(jì)算各元素的各種對數(shù) |
numpy.sign(array) | 計(jì)算各元素正負(fù)號 |
numpy.isnan(array) | 計(jì)算各元素是否為NaN |
numpy.isinf(array) | 計(jì)算各元素是否為NaN |
numpy.cos/cosh/sin/sinh/tan/tanh(array) | 三角函數(shù) |
numpy.modf(array) | 將array中值得整數(shù)和小數(shù)分離,作兩個(gè)數(shù)組返回 |
numpy.ceil(array) | 向上取整,也就是取比這個(gè)數(shù)大的整數(shù) |
numpy.?oor(array) | 向下取整,也就是取比這個(gè)數(shù)小的整數(shù) |
numpy.rint(array) | 四舍五入 |
numpy.trunc(array) | 向0取整 |
numpy.cos(array) | 正弦值 |
numpy.sin(array) | 余弦值 |
numpy.tan(array) | 正切值 |
numpy.add(array1,array2) | 元素級加法 |
numpy.subtract(array1,array2) | 元素級減法 |
numpy.multiply(array1,array2) | 元素級乘法 |
numpy.sqrt(array) | 平方根函數(shù) |
numpy.divide(array1,array2) | 元素級除法 array1./array2 |
numpy.power(array1,array2) | 元素級指數(shù) array1.^array2 |
numpy.maximum/minimum(array1,aray2) | 元素級最大值 |
numpy.fmax/fmin(array1,array2) | 元素級最大值伸蚯,忽略NaN |
numpy.mod(array1,array2) | 元素級求模 |
numpy.copysign(array1,array2) | 將第二個(gè)數(shù)組中值得符號復(fù)制給第一個(gè)數(shù)組中值 |
numpy.greater/greater_equal/less/less_equal/equal/not_equal (array1,array2) | 元素級比較運(yùn)算摩渺,產(chǎn)生布爾數(shù)組 |
numpy.logical_end/logical_or/logic_xor(array1,array2) | 元素級的真值邏輯運(yùn)算 |
五、數(shù)組操作
1剂邮、數(shù)組添加证逻、刪除和去重
(1)數(shù)組的添加
# 1. numpy.append 函數(shù)在數(shù)組的末尾添加值。追加操作會(huì)分配整個(gè)數(shù)組抗斤,并把原來的數(shù)組復(fù)制到新數(shù)組中囚企。 此外,輸入數(shù)組的維度必須匹配否則將生成ValueError瑞眼。注意:最多兩個(gè)數(shù)組拼接龙宏,不能三個(gè)及以上進(jìn)行拼接
'''
參數(shù)說明:
arr:輸入數(shù)組
values:要向arr添加的值,需要和arr形狀相同(除了要添加的軸)
axis:默認(rèn)為 None伤疙。當(dāng)axis無定義時(shí)银酗,是橫向加成辆影,返回總是為一維數(shù)組!當(dāng)axis有定義的時(shí)候黍特,分別為0和1的時(shí)候蛙讥。當(dāng)axis有定義的時(shí)候,分別為0的時(shí)候(列數(shù)要相同)灭衷。當(dāng)axis為1時(shí)次慢,數(shù)組是加在右邊(行數(shù) 要相同)。
'''
a = np.array([[1,2,3],[4,5,6]])
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')
print ('向數(shù)組添加元素:')
print (np.append(a, [7,8,9]))
print ('\n')
print ('沿軸 0 添加元素:')
print (np.append(a, [[7,8,9]],axis = 0))
print ('\n')
print ('沿軸 1 添加元素:')
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
# 2. numpy.insert 函數(shù)在給定索引之前翔曲,沿給定軸在輸入數(shù)組中插入值迫像。
# 如果值的類型轉(zhuǎn)換為要插入,則它與輸入數(shù)組不同瞳遍。 插入沒有原地的闻妓,函數(shù)會(huì)返回一個(gè)新數(shù)組。 此外掠械,如果未提供軸由缆,則輸入數(shù)組會(huì)被展開。
a = np.array([[1,2],[3,4],[5,6]])
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')
print ('未傳遞 Axis 參數(shù)猾蒂。 在插入之前輸入數(shù)組會(huì)被展開均唉。')
print (np.insert(a,3,[11,12]))
print ('\n')
print ('傳遞了 Axis 參數(shù)。 會(huì)廣播值數(shù)組來配輸入數(shù)組婚夫。')
print ('沿軸 0 廣播:')
print (np.insert(a,1,11,axis = 0))
print ('\n')
print ('沿軸 1 廣播:')
print (np.insert(a,1,11,axis = 1))
(2)數(shù)組中的刪除
#numpy.delete 函數(shù)返回從輸入數(shù)組中刪除指定子數(shù)組的新數(shù)組浸卦。 與 insert() 函數(shù)的情況一樣署鸡,如果未提供軸參數(shù)案糙,則輸入數(shù)組將展開。
'''
參數(shù)說明:
arr: 輸入數(shù)組
obj:可以被切片靴庆,整數(shù)或者整數(shù)數(shù)組时捌,表明要從輸入數(shù)組刪除的子數(shù)組
axis:沿著它刪除給定子數(shù)組的軸,如果未提供炉抒,則輸入數(shù)組會(huì)被展開
'''
a = np.arange(12).reshape(3,4)
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')
print ('未傳遞 Axis 參數(shù)奢讨。 在刪除之前輸入數(shù)組會(huì)被展開。')
print (np.delete(a,5))
print ('\n')
print ('刪除每一行中的第二列:')
print (np.delete(a,1,axis = 1))
print ('\n')
(3)數(shù)組去重
# numpy.unique 函數(shù)用于去除數(shù)組中的重復(fù)元素焰薄。
'''
arr:輸入數(shù)組拿诸,如果不是一維數(shù)組則會(huì)展開 return_index:如果為true,返回新列表元素在舊列表中的位置(下標(biāo))塞茅,并以列表形式存儲(chǔ)
return_inverse:如果為true亩码,返回舊列表元素在新列表中的位置(下標(biāo)),并以列表形式存儲(chǔ)
return_counts:如果為true野瘦,返回去重?cái)?shù)組中的元素在原數(shù)組中的出現(xiàn)次數(shù)
'''
a = np.array([5,2,6,2,7,5,6,8,2,9])
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')
print ('第一個(gè)數(shù)組的去重值:')
u = np.unique(a)
print (u)
print ('\n')
print ('去重?cái)?shù)組的索引數(shù)組:')
u,indices = np.unique(a, return_index = True)
print (indices)
print ('\n')
print ('我們可以看到每個(gè)和原數(shù)組下標(biāo)對應(yīng)的數(shù)值:')
print (a)
print ('\n')
print ('去重?cái)?shù)組的下標(biāo):')
u,indices = np.unique(a,return_inverse = True)
print (u)
print (indices) print ('\n')
print ('返回去重元素的重復(fù)數(shù)量:')
u,indices = np.unique(a,return_counts = True)
print (u)
print (indices)
2描沟、數(shù)組的拼接
有的時(shí)候我們需要將兩個(gè)數(shù)據(jù)加起來一起研究分析飒泻,我們就可以將其進(jìn)行拼接然后分析。
# 1. 根據(jù)軸連接的數(shù)組序列
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
# 要求a,b兩個(gè)數(shù)組的維度相同
print ('沿軸 0 連接兩個(gè)數(shù)組:')
print (np.concatenate((a,b),axis= 0))
print ('\n')
print ('沿軸 1 連接兩個(gè)數(shù)組:')
print (np.concatenate((a,b),axis = 1))
# 2. 根據(jù)軸進(jìn)行堆疊
print ('沿軸 0 連接兩個(gè)數(shù)組:')
print (np.stack((a,b),axis= 0))
print ('\n')
print ('沿軸 1 連接兩個(gè)數(shù)組:')
print (np.stack((a,b),axis = 1))
# 3. 矩陣垂直拼接
v1 = [[0,1,2,3,4,5],[6,7,8,9,10,11]]
v2 = [[12,13,14,15,16,17],[18,19,20,21,22,23]]
result = np.vstack((v1,v2))
print(result)
# 4. 矩陣水平拼接
v1 = [[0,1,2,3,4,5],[6,7,8,9,10,11]]
v2 = [[12,13,14,15,16,17],[18,19,20,21,22,23]]
result = np.hstack((v1,v2))
print(result)
3吏廉、數(shù)組的分割
# 1. 將一個(gè)數(shù)組分割為多個(gè)子數(shù)組
'''
參數(shù)說明:
ary: 被 分 割 的 數(shù) 組 indices_or_sections:果是一個(gè)整數(shù)泞遗,就用該數(shù)平均切分,如果是一個(gè)數(shù)組席覆,為沿軸切分的位置(左開右 閉)
axis:沿著哪個(gè)維度進(jìn)行切向史辙,默認(rèn)為0,橫向切分娜睛。為1時(shí)髓霞,縱向切分'''
# arr = np.arange(9).reshape(3,3)
# print ('將數(shù)組分為三個(gè)大小相等的子數(shù)組:')
# b = np.split(arr,3)
# print (b)
# 2.numpy.hsplit 函數(shù)用于水平分割數(shù)組,通過指定要返回的相同形狀的數(shù)組數(shù)量來拆分原數(shù)組畦戒。
# floor() 返回?cái)?shù)字的下舍整數(shù)方库。
harr = np.floor(10 * np.random.random((2, 6)))
# print ('原array:')
# print(harr)
# print ('拆分后:')
# print(np.hsplit(harr, 3))
# 3.numpy.vsplit 沿著垂直軸分割
a = np.arange(16).reshape(4,4)
# print ('第一個(gè)數(shù)組:')
# print (a)
# print ('\n')
# print ('豎直分割:')
# b = np.vsplit(a,2)
# print (b)
六、數(shù)組中 nan
和 inf
C 語言中表示最大的正整數(shù)值是 0x7FFFFFFF障斋,最小的負(fù)整數(shù)是 0x80000000纵潦。inf
表示無窮大,需要使用 ?oat(‘inf’)
函數(shù)來轉(zhuǎn)化垃环,那么對應(yīng)的就有 ?oat('-inf')
表示無窮小了邀层。這樣你就可以使用任意數(shù)來判斷和它的關(guān)系了。
那什么時(shí)候會(huì)出現(xiàn) inf
呢遂庄?比如一個(gè)數(shù)字除以 0寥院,Python 中會(huì)報(bào)錯(cuò),但是 numpy 中會(huì)是一個(gè) inf
或者 -inf
涛目。
另外還有 nan
秸谢,這種寫法在 pandas 中常見,表示缺失的數(shù)據(jù)霹肝,所以一般用 nan
來表示估蹄。任何與其做運(yùn)算結(jié)果都是 nan
。
# 創(chuàng)建一個(gè)nan和inf
a = np.nan
b = np.inf
print(a,type(a))
print(b,type(b))
# --判斷數(shù)組中為nan的個(gè)數(shù)(注意:float類型的數(shù)據(jù)才能賦值nan)
t = np.arange(24,dtype=float).reshape(4,6)
# 可以使用np.count_nonzero() 來判斷非零的個(gè)數(shù)
print(np.count_nonzero(t))
# 將三行四列的數(shù)改成nan
t[3,4] = np.nan
# 并且 np.nan != np.nan 結(jié)果 是TRUE
# 所以我們可以使用這兩個(gè)結(jié)合使用判斷nan的個(gè)數(shù)
print(np.count_nonzero(t != t))
# 注意: nan和任何數(shù)計(jì)算都為nan
print(np.sum(t,axis=0))
# 將 nan 替換為 0
t[np.isnan(t)] = 0 print(t)
#----------練習(xí): 處理數(shù)組中nan
t = np.arange(24).reshape(4,6).astype('float')
# 將數(shù)組中的一部分替換nan
t[1,3:] = np.nan
print(t)
# 遍歷每一列沫换,然后判斷每一列是否有nan
for i in range(t.shape[1]):
#獲取當(dāng)前列數(shù)據(jù)
temp_col = t[:,i]
# 判斷當(dāng)前列的數(shù)據(jù)中是否含有nan
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0: # 條件成立說明含有nan
# 將這一列不為nan的數(shù)據(jù)拿出來
temp_col_not_nan = temp_col[temp_col==temp_col]
# 將nan替換成這一列的平均值
temp_col[np.isnan(temp_col)] = np.mean(temp_col_not_nan)
print(t)
這里注意把握兩個(gè)重點(diǎn):
np.nan != np.nan
結(jié)果是True
臭蚁,也就是np.nan != np.nan
結(jié)果為False
,nan
不等于nan
讯赏!nan
和任何數(shù)計(jì)算結(jié)果都為nan
七垮兑、二維數(shù)組的轉(zhuǎn)置
#對換數(shù)組的維度
a = np.arange(12).reshape(3,4)
print ('原數(shù)組:')
print (a)
print ('\n')
print (' 對換數(shù)組 :')
print (np.transpose(a))
# 與transpose一致
a = np.arange(12).reshape(3,4)
print ('原數(shù)組:')
print (a)
print ('\n')
print ('轉(zhuǎn)置數(shù)組:')
print (a.T)
# 函數(shù)用于交換數(shù)組的兩個(gè)軸
t1 = np.arange(24).reshape(4,6)
re = t1.swapaxes(1,0)
print ('原數(shù)組:')
print (t1) print ('\n')
print ('調(diào)用 swapaxes 函數(shù)后的數(shù)組:')
print (re)