數(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é)果為 Falsenan 不等于 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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漱挎,隨后出現(xiàn)的幾起案子系枪,更是在濱河造成了極大的恐慌,老刑警劉巖识樱,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗤无,死亡現(xiàn)場離奇詭異震束,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)当犯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門垢村,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚎卫,你說我怎么就攤上這事嘉栓。” “怎么了拓诸?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵侵佃,是天一觀的道長。 經(jīng)常有香客問我奠支,道長馋辈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任倍谜,我火速辦了婚禮羔味,結(jié)果婚禮上丁逝,老公的妹妹穿的比我還像新娘绵疲。我一直安慰自己呛伴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布季春。 她就那樣靜靜地躺著洗搂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪载弄。 梳的紋絲不亂的頭發(fā)上耘拇,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音侦锯,去河邊找鬼驼鞭。 笑死秦驯,一個(gè)胖子當(dāng)著我的面吹牛尺碰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播译隘,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼亲桥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了固耘?” 一聲冷哼從身側(cè)響起题篷,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厅目,沒想到半個(gè)月后番枚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體法严,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年葫笼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了深啤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡路星,死狀恐怖溯街,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洋丐,我是刑警寧澤呈昔,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站友绝,受9級特大地震影響堤尾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迁客,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一哀峻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哲泊,春花似錦剩蟀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至先朦,卻和暖如春缰冤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喳魏。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工棉浸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刺彩。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓迷郑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親创倔。 傳聞我的和親對象是個(gè)殘疾皇子嗡害,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容