i,大家好。
我們?cè)谌粘9ぷ髦校瑫?huì)用Excel來(lái)進(jìn)行數(shù)據(jù)分析,尤其是數(shù)值處理。今天我們來(lái)分享一下Excel中都有哪些最常用的數(shù)值處理函數(shù)。這里面包括了常用的四舍五入、向上向下取整、奇偶判斷、絕對(duì)值;中值、眾數(shù)、隨機(jī)數(shù)、組合數(shù)等。另外,這些函數(shù)看似簡(jiǎn)單,但是也有些需要主要的地方。同時(shí),有些函數(shù)會(huì)有意想不到的用法。可以說(shuō),本文將總結(jié)數(shù)值類處理函數(shù)的常用用法,掌握它們將使得我們更為全面地理解Excel的函數(shù),提升工作效率。
1.round函數(shù)
round英文本意是圓的,整數(shù)的,因此在Excel中用于對(duì)數(shù)據(jù)進(jìn)行指定位數(shù)的四舍五入。
語(yǔ)法:=round(數(shù)值,四舍五入的位數(shù))
=ROUND(number,num_digits)
說(shuō)明:四舍五入位數(shù)為0時(shí),進(jìn)行取整四舍五入;位數(shù)為正時(shí),表示在小數(shù)點(diǎn)右邊保留小數(shù)多少位進(jìn)行四舍五入;位數(shù)為負(fù)時(shí),表示在小數(shù)點(diǎn)左邊進(jìn)行四舍五入(例如整十整百等四舍五入操作)
注意點(diǎn):當(dāng)四舍五入位數(shù)為負(fù)時(shí)的特殊作用,這種用法可以對(duì)一些預(yù)測(cè)的數(shù)據(jù)進(jìn)行取整十整百等的處理。
2.int函數(shù)
Int是integer的縮寫,表示整數(shù)的意思,因此int會(huì)對(duì)數(shù)值進(jìn)行向下的取整處理,即取值的結(jié)果不大于原來(lái)的數(shù)值
語(yǔ)法:=int(數(shù)值),=int()
說(shuō)明:
注意點(diǎn):向下取整,尤其是負(fù)數(shù)是的結(jié)果需要理解一下。
3.rounddown函數(shù)
Round+down,向下指定位數(shù)舍入。
語(yǔ)法:=rounddown(數(shù)值,舍入后的數(shù)值位數(shù))
說(shuō)明:
注意點(diǎn):注意當(dāng)舍入位數(shù)為0時(shí),與int函數(shù)返回結(jié)果的區(qū)別,尤其是值為負(fù)值時(shí)。
4.roundup函數(shù)
Round+up,向上指定位數(shù)舍入。
語(yǔ)法:=roundup(數(shù)值,舍入后的數(shù)值位數(shù))
說(shuō)明:roundup與rounddown相對(duì)應(yīng),一個(gè)是向下,一個(gè)向上。
注意點(diǎn):roundup和rounddown函數(shù)與是否負(fù)數(shù)無(wú)關(guān),都是按照正數(shù)的方式進(jìn)行指定位數(shù)舍入。
5.ceiling函數(shù)
Ceiling是天花板,函數(shù)意思是按基數(shù)進(jìn)行指定倍數(shù)的向上舍入。
語(yǔ)法:=CEILING(數(shù)值, 基數(shù)),=CEILING(number,significance)
說(shuō)明:函數(shù)的處理機(jī)制是用數(shù)值除以基數(shù)得到一個(gè)倍數(shù),然后將倍數(shù)向上取整,取整后再乘以基數(shù)得到最終結(jié)果。
=ceiling(8,3),返回結(jié)果9。首先8/3=2.666..,倍數(shù)取整后得到3,向上取整倍數(shù)3乘以基數(shù)3得到結(jié)果9。
注意點(diǎn):和int類似,注意負(fù)數(shù)時(shí)的函數(shù)執(zhí)行情況。如果除出來(lái)的倍數(shù)是負(fù)數(shù),向上取整就是向0的方向取整。-2.3取整后就是-2。
6.floor函數(shù)
floor是地板的意思,函數(shù)意思是按基數(shù)進(jìn)行指定倍數(shù)的向下舍入。
語(yǔ)法:=floor(數(shù)值, 基數(shù)),=floor(number,significance)
說(shuō)明:函數(shù)的處理機(jī)制是用數(shù)值除以基數(shù)得到一個(gè)倍數(shù),然后將倍數(shù)向下取整,取整后再乘以基數(shù)得到最終結(jié)果。
=floor(8,3),返回結(jié)果6。首先8/3=2.666..,倍數(shù)取整后得到2,向上取整倍數(shù)2乘以基數(shù)3得到結(jié)果6。
注意點(diǎn):和int類似,注意負(fù)數(shù)時(shí)的函數(shù)執(zhí)行情況。如果除出來(lái)的倍數(shù)是負(fù)數(shù),向下取整就是逆向0的方向取整。-2.66取整后就是-3。
Floor和Ceiling函數(shù),在新的Excel版本中提供了另外兩個(gè)函數(shù):floor.math和ceiling.math的兩個(gè)升級(jí)函數(shù),兩個(gè)函數(shù)都新增了一個(gè)mode參數(shù),用于控制當(dāng)數(shù)值為負(fù)數(shù)時(shí),控制舍入的方向,朝0或反向0的方向進(jìn)行舍入。
7.abs函數(shù)
Abs函數(shù)就是對(duì)數(shù)值進(jìn)行絕對(duì)值取值
語(yǔ)法:=abs(數(shù)值)
說(shuō)明:
8.rand函數(shù)
rand,random的縮寫,隨機(jī)的意思,函數(shù)會(huì)參數(shù)一個(gè)0-1的隨機(jī)數(shù)。
語(yǔ)法:=rand(),無(wú)參數(shù)
9.randbetween函數(shù)
Rand+between,隨機(jī)產(chǎn)生一個(gè)范圍內(nèi)的整數(shù)
語(yǔ)法:=randbetween(最小整數(shù),最大整數(shù))
說(shuō)明:
=randbetween(1,100),返回1到100的隨機(jī)整數(shù)
注意點(diǎn):
那么產(chǎn)生1-100的隨機(jī)數(shù)怎么辦?=randbetween(1,100)+rand()
10.trunc函數(shù)
Trunc函數(shù)用于將數(shù)字的小數(shù)部分截去,返回整數(shù)。或者我們也可以指定保留幾位小數(shù),超出部分會(huì)被截去。
這個(gè)函數(shù)類似于rounddown函數(shù)
語(yǔ)法:=trunc(數(shù)值,[保留位數(shù)]),當(dāng)取整時(shí),可以不寫保留位數(shù)。
注意點(diǎn):這個(gè)函數(shù)只是截取函數(shù),本身不做任何方向的舍入。
11.isodd 和 iseven函數(shù)
Is+odd,表示是否是基數(shù),同理is+even表是否是偶數(shù)。
語(yǔ)法:=isood(數(shù)值),=iseven(數(shù)值)。由于是判斷函數(shù),兩個(gè)函數(shù)都返回True 或者False。
注意點(diǎn):可以外層用if,內(nèi)部判斷條件用這兩個(gè)函數(shù)來(lái)進(jìn)行判斷,并顯示奇數(shù)或者偶數(shù)。這兩個(gè)函數(shù)也有其它的替代的處理方式,比如用mod進(jìn)行求余處理。
12. mod函數(shù)
Mod函數(shù)用于求余數(shù)。
語(yǔ)法:=mod(被除數(shù),除數(shù)),返回兩者的余數(shù)。
注意點(diǎn):
Mod本身是用于求余數(shù),但是我們用一個(gè)遞增的整數(shù)去除以一個(gè)固定的數(shù),就會(huì)得到一組循環(huán)的遞增的余數(shù)。
例如,我們用mod(row(),3)就會(huì)循環(huán)得到0,1,2的余數(shù)。假定我們需要每隔2行進(jìn)行單元格底色填充,我們就可以用條件格式進(jìn)行設(shè)置。當(dāng)條件格式的公式mod(row(),3)=2時(shí),則填充底色。可以嘗試一下,這是一種非常有趣的用法。
13. MEDAIN函數(shù)
中位數(shù)函數(shù),用于求一組數(shù)中的中位數(shù)
語(yǔ)法:=medain(數(shù)值1, [數(shù)值2], ...)
說(shuō)明:
假設(shè)A1:A6單元格的值分別是1,2,3,4,5,6
那么=median(A1:A6),返回值為3.5。因?yàn)楫?dāng)數(shù)據(jù)系列是偶數(shù)個(gè)時(shí),中位數(shù)會(huì)取順序排列的中間兩個(gè)數(shù)據(jù)的均值,即本例中的(3+4)/2=3.5
注意點(diǎn):
Median函數(shù)可以有其它一些擴(kuò)展用法。
例如:
假設(shè)我們有一組考試成績(jī)的數(shù)值,要求是低于60分的按60分計(jì),高于100分的按100分計(jì),60-100分的維持原狀。
一般做法肯定是用if進(jìn)行嵌套處理。假設(shè)A2是存放的分值數(shù)據(jù),則判斷公式:=if(A2<60,60,if(A2>100,100,A2))。這里用到了2層判斷。
但是這里我們也可以用medain函數(shù)進(jìn)行處理,即公式:=median(A2,60,100)
邏輯上我們來(lái)理清一下:
靈活使用這些數(shù)值函數(shù),將會(huì)大大提高我們的數(shù)值數(shù)據(jù)處理效率。
以上,是今日分享的內(nèi)容。
我是華哥。每日精進(jìn),不負(fù)光陰韶華。
贈(zèng)人玫瑰,手留余香。歡迎評(píng)論、點(diǎn)贊、關(guān)注,轉(zhuǎn)發(fā)。
在當(dāng)下 AI 迅猛發(fā)展的時(shí)期,Python 憑借其簡(jiǎn)潔易讀的語(yǔ)法以及強(qiáng)大的表現(xiàn)力,深受程序員與科學(xué)家的青睞。本文旨在展示 Python 僅用 10 行代碼便能完成復(fù)雜數(shù)學(xué)運(yùn)算的強(qiáng)大能力,涵蓋向量加法、點(diǎn)積、矩陣乘法、矩陣轉(zhuǎn)置以及線性系統(tǒng)求解器等諸多方面。
回想最初使用 Python 時(shí),NumPy 或 SymPy 尚未出現(xiàn)。那時(shí),研究常借助 MatLab,快速原型設(shè)計(jì)依賴 Delphi……甚至還會(huì)在 Prolog 中進(jìn)行符號(hào)計(jì)算。那時(shí)的 Python 類似優(yōu)化版的 Perl,但并非研究人員的首選。
不過(guò),用它編寫程序頗具趣味,我因而選擇以 Python 來(lái)實(shí)現(xiàn)論文中的部分實(shí)驗(yàn),其中涉及一些線性代數(shù)的內(nèi)容。起初,我采用類似 Pascal 風(fēng)格的嵌套循環(huán)程序,感覺較為枯燥,然而隨著對(duì) Python 研究的深入,有趣的一面逐漸展現(xiàn)。
某一時(shí)刻,我察覺到這門語(yǔ)言絕非僅能編寫嵌套循環(huán),于是開始更深入地探索,而非局限于論文所需——這或許是我所做的最佳“錯(cuò)誤”決定。
Python 以其友好的學(xué)習(xí)曲線著稱,但這也可能帶來(lái)問(wèn)題。您可以用 Python 編寫類似 Pascal、C++ 或 Lisp 的程序,但只有以 Python 特有的方式編寫,方能充分發(fā)揮其優(yōu)勢(shì)。
好在,即便僅掌握 Python 的基礎(chǔ)知識(shí),可能會(huì)錯(cuò)失精彩部分,但用戶體驗(yàn)依然良好。
為闡釋這一點(diǎn),我選取了線性代數(shù)領(lǐng)域。按理說(shuō),Python 有眾多出色的庫(kù)可處理線性代數(shù),因此無(wú)需重新實(shí)現(xiàn)文中提及的內(nèi)容。而我選擇線性代數(shù),旨在證明 Python 中以少量代碼表達(dá)豐富含義的語(yǔ)法是完全可行的(免責(zé)聲明:為保證可讀性,部分代碼示例未嚴(yán)格限制在一行內(nèi),示例中的所有縮進(jìn)純粹是為了提升閱讀體驗(yàn))。
def scaled(A, x):
B=list()
for i in range(len(A)):
B.append( A[i] * x )
return B
這種寫法雖無(wú)過(guò)錯(cuò),也有其優(yōu)點(diǎn),例如總能找到一行設(shè)置斷點(diǎn),但確實(shí)顯得有些“冗長(zhǎng)”。在 Python 中,您可以簡(jiǎn)潔地寫成:
def scaled(A, x): return [ai*x for ai in A]
然后其運(yùn)行效果如下:
List comprehension
[1.0, 4.0, 3.0]
* 2.0
[,...
Step 1
[1.0, 4.0, 3.0]
* 2.0
[2.0,...
Step 2
[1.0, 4.0, 3.0]
* 2.0
[2.0, 8.0,...
Step 3
[1.0, 4.0, 3.0]
* 2.0
[2.0, 8.0, 6.0]
不過(guò),列表解析并非 Python 所獨(dú)有,Haskell 和 Clojure 也具備類似功能,甚至 C# 的 LINQ 也為范圍提供了特殊語(yǔ)法。鮮為人知的是,Python 還支持字典解析和元組解析。
>>> [2*v for v in [1.0, 2.0, 3.0]]
[2.0, 4.0, 6.0]
>>> {k:2*v for k, v in {0:1.0, 1:4.0, 2:3.0}.items()}
{0: 2.0, 1: 8.0, 2: 6.0}
>>> tuple(2*v for v in (1.0, 4.0, 3.0))
(2.0, 8.0, 6.0)
>>> A=[1, 2, 3]
>>> B=('a', 'b', 'c')
>>> C={1:'a', 2:'b', 3:'c'}
>>> D=xrange(123)
>>> zip(A, B, C, D)
[(1, 'a', 1, 0), (2, 'b', 2, 1), (3, 'c', 3, 2)]
同樣,您可以用一行代碼實(shí)現(xiàn)向量加法。
def sum_of(A, B): return [ai+bi for (ai, bi) in zip(A, B)]
對(duì)于兩組列表,這能夠如同拉鏈一般將數(shù)據(jù)壓縮在一起。
List zipping
A=[1.0, 4.0, 3.0]
B=[7.0, 3.0, 1.0]
zip(A, B)=[...
Step 1
A=[1.0, 4.0, 3.0]
B=[7.0, 3.0, 1.0]
zip(A, B)=[(1.0, 7.0),...
Step 2
A=[1.0, 4.0, 3.0]
B=[7.0, 3.0, 1.0]
zip(A, B)=[(1.0, 7.0), (4.0, 3.0),...
Step 3
A=[1.0, 4.0, 3.0]
B=[7.0, 3.0, 1.0]
zip(A, B)=[(1.0, 7.0), (4.0, 3.0), (3.0, 1.0)]
def dot_of(A, B): return sum([ai*bi for (ai, bi) in zip(A, B)])
然而,有時(shí)簡(jiǎn)單的求和并不足夠。例如在處理浮點(diǎn)數(shù)時(shí),可能會(huì)遭遇一些惱人的小誤差。為了更加便利,Python 提供了另一個(gè)求和函數(shù),能夠?qū)Σ糠智蠛瓦M(jìn)行操作,從而獲取更精確的輸出。
>>> [0.1]*10
[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
>>> sum([0.1]*10)
0.9999999999999999
>>> import math
>>> math.fsum([0.1]*10)
1.0
def identity(n):
return [[1.0 if i==j else 0.0
for j in range(n)]
for i in range(n)]
這實(shí)際上是一個(gè)包含條件表達(dá)式的嵌套列表解析,結(jié)果如下:
Conditional expression: 0==0
j=0
[[1.0,... i=0
Conditional expression: 1!=0
j=1
[[1.0, 0.0,... i=0
Conditional expression: 2!=0
j=2
[[1.0, 0.0, 0.0],... i=0
Conditional expression: 0!=1
j=0
[[1.0, 0.0, 0.0],
[0.0,... i=1
Conditional expression: 1==1
j=1
[[1.0, 0.0, 0.0],
[0.0, 1.0,... i=1
Conditional expression: 2!=1
j=2
[[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],... i=1
Conditional expression: 0!=2
j=0
[[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0,... i=2
Conditional expression: 1!=2
j=1
[[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0,... i=2
Conditional expression: 2==2
j=2
[[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0]] i=2
條件表達(dá)式在簡(jiǎn)潔性和表達(dá)力方面表現(xiàn)出色,但由于它們是表達(dá)式,所以不易添加副作用。但并非完全不可能,只是需要一些技巧。在 Python 中,元組計(jì)算會(huì)從左到右依次計(jì)算每個(gè)元組元素,所以當(dāng)您需要在表達(dá)式中添加更多內(nèi)容時(shí),只需使用元組即可。
def identity(n):
return [[1.0 if i==j else (0.0,
sys.stdout.write("i!=j\n")
)[0]
for j in range(n)]
for i in range(n)]
您也不能在表達(dá)式中使用 print,因?yàn)樗鼈儾粦?yīng)具有副作用,但可以使用 sys.stdout.write。
def identity(n):
return [[1.0 if i==j else (0.0,
sys.stdout.write("i!=j\n")
)[0]
for j in range(n)]
for i in range(n)]
同樣的技巧也適用于 lambda 表達(dá)式,您可以通過(guò)元組讓您的 lambda 表達(dá)式盡可能復(fù)雜。不過(guò)建議若非必要,請(qǐng)勿如此操作。
我猜測(cè)肯定會(huì)有人反駁說(shuō),“您的例子根本無(wú)需條件表達(dá)式!”的確如此。在 Python 中,您可以顯式地將布爾類型變量轉(zhuǎn)換為浮點(diǎn)數(shù)變量。
def identity(n):
return [[float(i==j) for j in range(n)] for i in range(n)]
這只是風(fēng)格問(wèn)題。就個(gè)人而言,我更傾向于將事實(shí)和數(shù)字分開,不這樣做也完全可行。
不過(guò),我們還需解決兩個(gè)問(wèn)題。一個(gè)較為簡(jiǎn)單:我們期望矩陣是一個(gè)列表,而非元組,所以需要通過(guò)一個(gè)簡(jiǎn)單的列表解析來(lái)解決。另一個(gè)問(wèn)題則需使用特殊的 Python 語(yǔ)法,它能讓我們將列表轉(zhuǎn)變?yōu)楹瘮?shù)參數(shù)的元組,此語(yǔ)法便是在矩陣前添加一個(gè)星號(hào)。
def transposed(A): return [list(aj) for aj in zip(*A)]
領(lǐng)取方式:私信回復(fù)666,免費(fèi)領(lǐng)取資料軟件~