數(shù)據(jù)分析課程筆記 - 10 - Numpy

大家好呀,今天我們學(xué)習(xí) Python 的一個(gè)科學(xué)計(jì)算庫 NumPy,它是用 Python 做數(shù)據(jù)分析所必不可少的一個(gè)第三方庫。

本節(jié)課的主要內(nèi)容有

  1. NumPy認(rèn)知
    (1)NumPy介紹
    (2)為什么要學(xué)NumPy
    (3)NumPy的優(yōu)勢
    (4)ndarray與Python原生list運(yùn)算效率對比
  2. 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ù)值修改
  3. 數(shù)組中的軸
  4. 數(shù)組的計(jì)算
    (1)數(shù)組和數(shù)的計(jì)算
    (2)數(shù)組與數(shù)組之間的操作
    (3)NumPy的計(jì)算方法
  5. 數(shù)組操作
    (1)數(shù)組添加、刪除和去重
    (2)數(shù)組的拼接
    (3)數(shù)組的分割
  6. 數(shù)組中 naninf
  7. 二維數(shù)組的轉(zhuǎn)置

課前準(zhǔn)備

安裝 Numpy

pip install -U numpy -i https://pypi.douban.com/simple

一、NumPy 認(rèn)知

1、NumPy 介紹

numpy

NumPy中文官網(wǎng)

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

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

** dtypenumpy.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ù)組軸

三維數(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ù)組中 naninf

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容