前言
numpy
是支持 Python
語(yǔ)言的數(shù)值計(jì)算擴(kuò)充庫(kù)登颓,其擁有強(qiáng)大的高維度數(shù)組處理與矩陣運(yùn)算能力舌镶。除此之外炕舵,numpy
還內(nèi)建了大量的函數(shù)栋荸,方便你快速構(gòu)建數(shù)學(xué)模型菇怀。
NumPy
官網(wǎng):http://www.numpy.org/
NumPy
官網(wǎng)教程:https://docs.scipy.org/doc/numpy/user/quickstart.html
安裝及導(dǎo)入numpy
安裝numpy:
pip install numpy
導(dǎo)入numpy,推薦做法是:
import numpy as np
當(dāng)然晌块,如果你不想像上面導(dǎo)入爱沟,你也可以和其他模塊導(dǎo)入方式一樣直接import numpy
,但還是推薦用import numpy as np
這種方式匆背,后面用到numpy
的地方都可以用別名np
了呼伸,更加簡(jiǎn)潔。
numpy數(shù)學(xué)中的計(jì)算
學(xué)習(xí)完后钝尸,可以熟練掌握數(shù)組各種方式的創(chuàng)建括享、屬性及數(shù)組操作;對(duì)矩陣的常見操作珍促、也可以對(duì)多項(xiàng)式求導(dǎo)铃辖、作圖等。
1.求矩陣A的秩
提示:在線性代數(shù)中猪叙,一個(gè)矩陣A的列秩是A的線性獨(dú)立的縱列的極大數(shù)目娇斩。類似地,行秩是A的線性無(wú)關(guān)的橫行的極大數(shù)目穴翩。通俗一點(diǎn)說(shuō)犬第,如果把矩陣看成一個(gè)個(gè)行向量或者列向量,秩就是這些行向量或者列向量的秩芒帕,也就是極大無(wú)關(guān)組中所含向量的個(gè)數(shù)歉嗓。
解析:在numpy中,求矩陣的秩用nf.linalg.matrix_rank(array)
2.求矩陣A的轉(zhuǎn)置矩陣
轉(zhuǎn)置矩陣:將矩陣的行列互換得到的新矩陣稱為轉(zhuǎn)置矩陣背蟆,轉(zhuǎn)置矩陣的行列式不變鉴分。
解析:在numpy中,求矩陣A的轉(zhuǎn)置矩陣用A.T
上面兩個(gè)問題用numpy
可快速計(jì)算出來(lái):
import numpy as nf
A = nf.mat([[3, 2, 0, 5, 0],
[3, -2, 3, 6, -1],
[2, 0, 1, 5, -3],
[1, 6, -4, -1, 4]])
print("矩陣A:")
print(A)
print("A的秩為:{}".format(nf.linalg.matrix_rank(A)))
print("A的轉(zhuǎn)置矩陣:")
print(A.T)
運(yùn)行結(jié)果:
矩陣A:
[[ 3 2 0 5 0]
[ 3 -2 3 6 -1]
[ 2 0 1 5 -3]
[ 1 6 -4 -1 4]]
A的秩為:3
A的轉(zhuǎn)置矩陣:
[[ 3 3 2 1]
[ 2 -2 0 6]
[ 0 3 1 -4]
[ 5 6 5 -1]
[ 0 -1 -3 4]]
手動(dòng)求解:
3.求矩陣A的逆矩陣
說(shuō)明:逆矩陣是對(duì)方陣定義的淆储,因此逆矩陣一定是方陣冠场。
逆矩陣:設(shè)A是數(shù)域上的一個(gè)n階矩陣家浇,若在相同數(shù)域上存在另一個(gè)n階矩陣B本砰,使得: AB=BA=E ,則我們稱B是A的逆矩陣钢悲,而A則被稱為可逆矩陣点额。注:E為單位矩陣舔株。
解析:在numpy中,求矩陣A的轉(zhuǎn)置矩陣用A.I
import numpy as nf
A = nf.mat([[0, 1, 2],
[1, 1, 4],
[2, -1, 0]])
print("矩陣A:")
print(A)
print("A的逆矩陣:")
print(A.I)
運(yùn)行結(jié)果:
矩陣A:
[[ 0 1 2]
[ 1 1 4]
[ 2 -1 0]]
A的逆矩陣:
[[ 2. -1. 1. ]
[ 4. -2. 1. ]
[-1.5 1. -0.5]]
手動(dòng)計(jì)算:
4.求y = -2x^2 + 4x + 16
的根还棱,并求出其導(dǎo)函數(shù)
解析:為了形象展示多項(xiàng)式载慈,我們借用matplotlib順便繪制了該函數(shù)的圖像。后面會(huì)專門學(xué)習(xí)如何繪制珍手,此處大概了解一下matplotlib即可办铡。numpy中的多項(xiàng)式:np.poly1d(arr),需要把參數(shù)傳入琳要。本例子中放在了一個(gè)數(shù)組中arr = np.array([-2, 4, 16])傳入的寡具。對(duì)多項(xiàng)式求導(dǎo),想要求幾階導(dǎo)數(shù)稚补,只需要這里實(shí)參m傳入數(shù)字幾即可童叠。func.deriv(m=1);定制定義域np.linspace(-4, 6, 100)课幕,這樣把-6--6之間進(jìn)行100等分厦坛,利用這些數(shù)據(jù)創(chuàng)建了一個(gè)長(zhǎng)度為100的數(shù)組。
import numpy as np
import matplotlib.pyplot as plt
# y = -2x^2 + 4x + 16
arr = np.array([-2, 4, 16])
func = np.poly1d(arr)
# m=1表示求一階導(dǎo)數(shù)乍惊,依次類推
func1 = func.deriv(m=1)
# 設(shè)置定義域-4,6杜秸;并將定義域等分了100份
x = np.linspace(-4, 6, 100)
y = func(x)
y1 = func1(x)
# 打印多項(xiàng)式
print(func)
# 打印多項(xiàng)式對(duì)應(yīng)的一階導(dǎo)數(shù)
print(func1)
# 繪制
plt.plot(x, y, label="{}".format(func))
plt.plot(x, y1, label="{}".format(func1))
plt.xlabel("x")
plt.ylabel("y")
# 顯示圖例
plt.legend()
print("多項(xiàng)式的根:")
print(np.roots(func))
# 顯示圖像
plt.show()
運(yùn)行結(jié)果:
數(shù)組的重要屬性
numpy
的主要操作對(duì)象是同類的多維數(shù)組,即一個(gè)由相同類型元素(通常是數(shù)字)組成的润绎、以正數(shù)為索引的數(shù)據(jù)表亩歹。在numpy
里面,維度稱為“軸”凡橱。
舉例來(lái)說(shuō)小作,三維空間內(nèi)一點(diǎn)的坐標(biāo)[1,2,1]
有一個(gè)軸,三個(gè)元素稼钩,所以我們通常稱它的長(zhǎng)度為3顾稀。在以下所示的例子中,數(shù)組有兩個(gè)軸坝撑,第一個(gè)軸的長(zhǎng)度為2静秆,第二個(gè)軸的長(zhǎng)度為3。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
numpy
的數(shù)組類型叫做ndarray
巡李,也就是numpy
數(shù)組(以下簡(jiǎn)稱為數(shù)組)抚笔。需要注意的是,numpy.array
不同于Python
標(biāo)準(zhǔn)庫(kù)中的array.array
,后者只處理一維的數(shù)組并且提供了很少的功能侨拦。一個(gè)ndarray
對(duì)象有以下一些重要的屬性:
ndarray.ndim
數(shù)組的軸的數(shù)量殊橙,即維度數(shù)量。
ndarray.shape
數(shù)組的維度。返回的是一個(gè)整數(shù)元組膨蛮,指示了一個(gè)數(shù)組在各個(gè)維度的大小叠纹。對(duì)于一個(gè)n行m列的矩陣來(lái)說(shuō),它的shape
是(n,m)
敞葛。shape
的元組長(zhǎng)度因此是軸的數(shù)量誉察,即ndim
。
ndarray.size
數(shù)組所有元素的數(shù)量惹谐,等于shape
返回元組元素的乘積持偏。
ndarray.dtype
一個(gè)用于描述數(shù)組元素類型的對(duì)象“奔。可以用標(biāo)準(zhǔn)Python類型來(lái)創(chuàng)造或指定dtype
的類型综液。另外,Numpy也提供了自己的類型儒飒,如numpy.int32
谬莹,numpy.int16
,numpy.float64
等桩了。
ndarray.itemsize
數(shù)組每個(gè)元素的字節(jié)大小附帽。比如一個(gè)數(shù)組的元素為float64
,它的itemsize
為8(=64/8)
井誉,
complex32
的itemsize
為4(=32/8)
蕉扮。這個(gè)屬性等同于ndarray.dtype.itemsize
。
ndarray.data
包含了數(shù)組每個(gè)實(shí)際元素的緩沖器颗圣。一般來(lái)說(shuō)我們不會(huì)用到這個(gè)屬性因?yàn)槲覀兛梢酝ㄟ^(guò)索引工具來(lái)獲取到數(shù)組的每個(gè)元素的值喳钟。
數(shù)組的創(chuàng)建
通過(guò)上面知識(shí),我們已經(jīng)知道在numpy
中在岂,數(shù)組是ndarray
類型的奔则,接下來(lái)我們就看看學(xué)習(xí)如何利用numpy
來(lái)創(chuàng)建各種數(shù)組。
1.利用構(gòu)造函數(shù)array()
創(chuàng)建
利用構(gòu)造函數(shù)array()
創(chuàng)建一維或多維數(shù)組蔽午,其參數(shù)是類似于數(shù)組的對(duì)象易茬,如列表等。當(dāng)然及老,也可以在創(chuàng)建的時(shí)候傳入數(shù)據(jù)類型抽莱,通過(guò)dtype=
指定,取值:
int系列包括np.int64
(默認(rèn))骄恶、np.int16
食铐、np.int32
、np.int128
僧鲁;
float系列包括:np.float64
(默認(rèn))虐呻、np.float16
象泵、np.float32
、np.float84
铃慷、np.float96
单芜、np.float128
蜕该、np.float256
等犁柜,示例如下:
import numpy as np
# 構(gòu)造函數(shù)構(gòu)建
arr1 = np.array([[1, 2, 3],
[4, 5, 6]])
# 創(chuàng)建的同時(shí)指定數(shù)據(jù)類型為float64
arr2 = np.array([[11, 22, 33],
[44, 55, 66]], dtype=np.float64)
print(arr1)
print(arr2)
運(yùn)行結(jié)果:
[[1 2 3]
[4 5 6]]
[[11. 22. 33.]
[44. 55. 66.]]
2.利用arrange()
創(chuàng)建
numpy
中arrange()
的用法和Python
中range()
一樣,我們可以直接傳入一個(gè)size堂淡,也可以指定起始值-結(jié)束值-步長(zhǎng)馋缅,numpy
中arrange()
還可以重新定義reshape(shape)
,如下面例子2.3中:np.arange(12).reshape((3, 4))
绢淀。示例如下:
import numpy as np
# 2.1利用arrange()來(lái)創(chuàng)建
arr3 = np.arange(12)
print(arr3)
print("-" * 20)
# 2.2利用arrange()來(lái)創(chuàng)建,
arr4 = np.arange(10, 21)
print(arr4)
print("+" * 20)
# 2.3利用arrange()來(lái)創(chuàng)建,重新定義shape
arr5 = np.arange(12).reshape((3, 4))
print(arr5)
運(yùn)行結(jié)果:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
--------------------
[10 11 12 13 14 15 16 17 18 19 20]
++++++++++++++++++++
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
3.生產(chǎn)隨機(jī)數(shù)來(lái)創(chuàng)建
利用np.random.random(12)
會(huì)生產(chǎn)一系列從0-1
之間的符合標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)組成的數(shù)組萤悴。我們指定隨機(jī)數(shù)的個(gè)數(shù),即要得到的數(shù)組長(zhǎng)度皆的,還可以在創(chuàng)建的同時(shí)重新定義shape:np.random.random((3, 4))
覆履。示例如下,要注意觀察不同:
import numpy as np
# 3.1 利用隨機(jī)數(shù)創(chuàng)建數(shù)組
random_arr4 = np.random.random(12)
print(random_arr4)
print("-" * 20)
# 3.2 利用隨機(jī)數(shù)創(chuàng)建數(shù)組, 并指定shape
random_arr5 = np.random.random((3, 4))
print(random_arr5)
運(yùn)行結(jié)果:
[0.47430035 0.27107492 0.786811 0.4158894 0.09536015 0.87473283 0.10045984 0.70662808 0.15931372 0.96116861 0.45779735 0.18718144]
--------------------
[[0.4010681 0.0760198 0.03891688 0.80331814]
[0.33589807 0.43356063 0.79576128 0.74174092]
[0.31945365 0.21740648 0.68029056 0.32781636]]
4.利用linspace()
線性等分來(lái)創(chuàng)建
numpy
中linspace(start, end, total_count)
線性等分來(lái)創(chuàng)建數(shù)組時(shí)费薄,需要傳入起始值硝全、結(jié)束值、將這段數(shù)等分為total_count
份楞抡。
這種創(chuàng)建方式特別適用于:知道起始值伟众、結(jié)束值和總個(gè)數(shù)的情況。常用來(lái)設(shè)置自變量的取值召廷,例如:x = np.linspace(-10, 10, 100)
,將會(huì)得到(-10, 10)
等分100份后的數(shù)據(jù)組成的數(shù)組凳厢。
import numpy as np
# 4 利用線性等分,創(chuàng)建數(shù)組
x = np.linspace(-10, 10, 50)
print(x)
運(yùn)行結(jié)果:
[-10. -9.59183673 -9.18367347 -8.7755102 -8.36734694
-7.95918367 -7.55102041 -7.14285714 -6.73469388 -6.32653061
-5.91836735 -5.51020408 -5.10204082 -4.69387755 -4.28571429
-3.87755102 -3.46938776 -3.06122449 -2.65306122 -2.24489796
-1.83673469 -1.42857143 -1.02040816 -0.6122449 -0.20408163
0.20408163 0.6122449 1.02040816 1.42857143 1.83673469
2.24489796 2.65306122 3.06122449 3.46938776 3.87755102
4.28571429 4.69387755 5.10204082 5.51020408 5.91836735
6.32653061 6.73469388 7.14285714 7.55102041 7.95918367
8.36734694 8.7755102 9.18367347 9.59183673 10. ]
5.全為0的數(shù)組np.zeros(shape)
numpy
提供了可以直接創(chuàng)建所有元素為0的數(shù)組竞慢,方式為:np.zeros(shape)
先紫。
官網(wǎng)的解釋:The function zeros creates an array full of zeros
,示例如下:
import numpy as np
# 5 全為0的數(shù)組
arr5 = np.zeros((3, 4))
print(arr5)
運(yùn)行結(jié)果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
6.全為1的數(shù)組np.ones(shape)
numpy
提供了可以直接創(chuàng)建所有元素為1的數(shù)組筹煮,方式為:np.ones(shape)
泡孩。
官網(wǎng)的解釋:the function ones creates an array full of ones
,示例如下:
import numpy as np
# 6 全為1的數(shù)組
arr6 = np.ones((2, 3, 4))
print(arr6)
運(yùn)行結(jié)果:
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
7.空元素?cái)?shù)組
numpy
提供了可以直接創(chuàng)建所有元素為1的數(shù)組寺谤,方式為:np.empty(shape)
仑鸥,要注意的是它的元素的初始值是隨機(jī)的,這取決于這塊內(nèi)存中的值变屁。
官網(wǎng)的解釋:the function empty creates an array whose initial content is random and depends on the state of the memory. By default, the dtype of the created array is float64
眼俊,示例如下:
import numpy as np
# 創(chuàng)建空元素?cái)?shù)組
arr7 = np.empty((3, 4))
print(arr7)
數(shù)組的常見操作
1.基本運(yùn)算
- 加、減粟关、乘疮胖、除
(+、-、*澎灸、/)
對(duì)兩個(gè)數(shù)組做加(減院塞、乘、除)法運(yùn)算性昭,是對(duì)應(yīng)位置的元素分別做加(減拦止、乘、除)法運(yùn)算糜颠。
示例如下:
import numpy as np
arr1 = np.array([[11, 12, 13],
[14, 15, 16]])
arr2 = np.array([[1, 2, 3],
[4, 5, 6]])
print("arr1:")
print(arr1)
print("arr2:")
print(arr2)
print("arr1 + arr2 = ")
print(arr1 + arr2)
print("arr1 - arr2 = ")
print(arr1 - arr2)
print("arr2 * arr1 = ")
print(arr2 * arr1)
print("arr1 / arr2 = ")
print(arr1 / arr2)
運(yùn)行結(jié)果:
arr1:
[[11 12 13]
[14 15 16]]
arr2:
[[1 2 3]
[4 5 6]]
arr1 + arr2 =
[[12 14 16]
[18 20 22]]
arr1 - arr2 =
[[10 10 10]
[10 10 10]]
arr2 * arr1 =
[[11 24 39]
[56 75 96]]
arr1 / arr2 =
[[11. 6. 4.33333333]
[ 3.5 3. 2.66666667]]
說(shuō)明:對(duì)兩個(gè)數(shù)組做加(減汹族、乘、除)法運(yùn)算其兴,是對(duì)應(yīng)位置的元素分別做加(減顶瞒、乘、除)法運(yùn)算元旬。正因?yàn)槿绱艘?guī)則榴徐,所以要求參與運(yùn)算的兩個(gè)數(shù)組為同形數(shù)組,也就是要求shape
必須一樣匀归,否則會(huì)報(bào)錯(cuò)ValueError: operands could not be broadcast together with shapes
坑资。
下面例子中,保持arr1
的shape
為(2, 3)
不變朋譬;利用reshape()
修改arr2
的shape
為(6,)
盐茎,此時(shí)再進(jìn)行加法運(yùn)算操作:
import numpy as np
arr1 = np.array([[11, 12, 13],
[14, 15, 16]])
arr2 = np.array([[1, 2, 3],
[4, 5, 6]]).reshape((6,))
print("arr1:")
print(arr1)
print("arr2:")
print(arr2)
print("arr1 + arr2 = ")
print(arr1 + arr2)
運(yùn)算結(jié)果:
Traceback (most recent call last):
File "D:/TensorFlowProjects/np_numpy/numpy_jianshu.py", line 15, in <module>
print(arr1 + arr2)
ValueError: operands could not be broadcast together with shapes (2,3) (6,)
- 多次方
(**)
在numpy中,多次方運(yùn)算同樣作用于數(shù)組中每個(gè)元素徙赢。運(yùn)算符號(hào)為**
字柠,運(yùn)算符**
后面是幾就做幾次運(yùn)算。同樣要求參與運(yùn)算的兩個(gè)數(shù)組為同形數(shù)組狡赐,也就是要求shape
必須一樣窑业,否則會(huì)報(bào)錯(cuò)ValueError: operands could not be broadcast together with shapes
。
例如:arr1 ** 2
表示對(duì)數(shù)組arr1
中每個(gè)元素做平方運(yùn)算枕屉。
再如:arr1 ** 3
表示對(duì)數(shù)組arr1
中每個(gè)元素做3次方運(yùn)算常柄。
import numpy as np
arr1 = np.arange(6).reshape((2, 3))
print("arr1: ")
print(arr1)
print("-" * 20)
# 2次方運(yùn)算
print(arr1 ** 2)
print("-" * 20)
# 3次方運(yùn)算
print(arr1 ** 3)
運(yùn)算結(jié)果:
arr1:
[[0 1 2]
[3 4 5]]
--------------------
[[ 0 1 4]
[ 9 16 25]]
--------------------
[[ 0 1 8]
[ 27 64 125]]
- 矩陣乘
矩陣乘是用np
提供的dot
,形如:np.dot(arr1, arr2)
或arr1.dot(arr2)
搀擂。需要注意的是西潘,參與運(yùn)算的兩個(gè)數(shù)組要符合矩陣乘的乘法要求:前一個(gè)矩陣的列必須等于后一個(gè)矩陣的行。如果不滿足此哨颂,則會(huì)運(yùn)行報(bào)錯(cuò)喷市。
下面例子,3行4列
x 4行2列
威恼,計(jì)算后將會(huì)得到3行2列
的矩陣品姓。
import numpy as np
arr1 = np.arange(12).reshape((3, 4))
arr2 = np.arange(8).reshape((4, 2))
print("arr1 = ")
print(arr1)
print("arr2 = ")
print(arr2)
print("-" * 20)
print(np.dot(arr1, arr2))
print("+" * 20)
print(arr1.dot(arr2))
運(yùn)算結(jié)果:
arr1 =
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
arr2 =
[[0 1]
[2 3]
[4 5]
[6 7]]
--------------------
[[ 28 34]
[ 76 98]
[124 162]]
++++++++++++++++++++
[[ 28 34]
[ 76 98]
[124 162]]
提示:
如果你在運(yùn)算過(guò)程中遇到ValueError: shapes (3,4) and (3,2) not aligned: 4 (dim 1) != 3 (dim 0)
寝并,則說(shuō)明參與運(yùn)算的兩個(gè)矩陣不符合矩陣乘的運(yùn)算規(guī)則:前一個(gè)矩陣的列必須等于后一個(gè)矩陣的行。
- 和數(shù)值比較
和數(shù)值比較腹备,形如arr1 > 3
衬潦,會(huì)把數(shù)組中每個(gè)元素和該數(shù)值3
進(jìn)行比較,滿足則為True
,不滿足則為False
植酥,最后會(huì)得到一個(gè)由True镀岛、False
組成的數(shù)組。
import numpy as np
arr1 = np.array([[0, 2, 4],
[1, 3, 5]])
print(arr1 > 3)
運(yùn)算結(jié)果:
[[0 2 4]
[1 3 5]]
[[False False True]
[False False True]]
- 求和
numpy中求和提供了sum
惧互,可以計(jì)算一個(gè)數(shù)組中所有元素的和np.sum(arr)
哎媚,也可以指定計(jì)算某個(gè)軸上的和np.sum(arr喇伯,axis=0或1或2等)
喊儡。
如果是2維數(shù)組,axis=0
表示計(jì)算列上的和稻据;axis=1
表示計(jì)算行上的和艾猜;
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)
# 計(jì)算所有元素的和
print(np.sum(arr_2d))
print("-" * 20)
# 計(jì)算指定軸上的元素的和
print(np.sum(arr_2d, axis=0))
print("-" * 20)
print(np.sum(arr_2d, axis=1))
運(yùn)行結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
66
--------------------
[12 15 18 21]
--------------------
[ 6 22 38]
如果是3維數(shù)組,形如shape 為 (2, 3, 4)的
捻悯,此時(shí)axis=0表示計(jì)算shape
為(3, 4)
數(shù)組求和匆赃,計(jì)算后會(huì)得到一個(gè)(3, 4)
數(shù)組。今缚;axis=1表示計(jì)算列上的和算柳,計(jì)算后會(huì)得到一個(gè)(2, 4)
數(shù)組;axis=2表示計(jì)算行上的和姓言,計(jì)算后會(huì)得到一個(gè)(2, 3)
數(shù)組瞬项;
import numpy as np
arr_3d = np.arange(24).reshape((2, 3, 4))
print(arr_3d)
# 計(jì)算所有元素的和
print("所有元素的和:{}".format(np.sum(arr_3d)))
# 計(jì)算指定軸上的元素的和
print("axis=0,shape=(2, 3, 4),會(huì)得到(3, 4)的數(shù)組:")
print(np.sum(arr_3d, axis=0))
print("axis=1,shape=(2, 3, 4),會(huì)得到(2, 4)的數(shù)組:")
print(np.sum(arr_3d, axis=1))
print("axis=2,shape=(2, 3, 4),會(huì)得到(2, 3)的數(shù)組:")
print(np.sum(arr_3d, axis=2))
運(yùn)行結(jié)果:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
所有元素的和:276
axis=0,shape=(2, 3, 4),會(huì)得到(3, 4)的數(shù)組:
[[12 14 16 18]
[20 22 24 26]
[28 30 32 34]]
axis=1,shape=(2, 3, 4),會(huì)得到(2, 4)的數(shù)組:
[[12 15 18 21]
[48 51 54 57]]
axis=2,shape=(2, 3, 4),會(huì)得到(2, 3)的數(shù)組:
[[ 6 22 38]
[54 70 86]]
如果是更高維數(shù)組,則依次類推何荚。關(guān)鍵是區(qū)分軸序號(hào)代表的是什么囱淋。
- 求最大值
numpy中求最大值提供了max
,可以計(jì)算一個(gè)數(shù)組中所有元素中最大的元素np.max(arr)
餐塘,也可以指定計(jì)算某個(gè)軸上的最大的元素np.max(arr妥衣,axis=0或1或2等)
。
求最大值所在的索引戒傻,np.argmax(arr税手,axis=0或1或2等)
import numpy as np
arr_2d = np.array([[2, 4, 6],
[1, 3, 5]])
print(arr_2d)
# 數(shù)組中最大元素
print("數(shù)組中最大元素{}".format(np.max(arr_2d)))
print("數(shù)組中最大元素索引{}".format(np.argmax(arr_2d)))
# 2維的軸axis=0上的最大值,也即列上的最大值
print("列上的最大值{}".format(np.max(arr_2d, axis=0)))
運(yùn)行結(jié)果:
[[2 4 6]
[1 3 5]]
數(shù)組中最大元素:6
數(shù)組中最大元素索引:2
列上的最大值:[2 4 6]
- 求最小值
numpy中求最小值提供了min
需纳,可以計(jì)算一個(gè)數(shù)組中所有元素最小元素值np.min(arr)
芦倒,也可以指定計(jì)算某個(gè)軸上的最小元素值np.min(arr,axis=0或1或2等)
候齿。
求最小值所在的索引熙暴,np.argmin(arr闺属,axis=0或1或2等)
import numpy as np
arr_2d = np.array([[2, 4, 6],
[1, 3, 5]])
print(arr_2d)
# 數(shù)組中最小元素
print("數(shù)組中最小元素:{}".format(np.min(arr_2d)))
print("數(shù)組中最小元素索引:{}".format(np.argmin(arr_2d)))
# 2維的軸axis=0上的最小值,也即列上的最小值
print("列上的最小值:{}".format(np.min(arr_2d, axis=0)))
運(yùn)行結(jié)果:
[[2 4 6]
[1 3 5]]
數(shù)組中最小元素:1
數(shù)組中最小元素索引:3
列上的最小值:[1 3 5]
- 求平均數(shù)周霉、中位數(shù)掂器、加權(quán)平均數(shù)
numpy中求平均數(shù)、中位數(shù)俱箱、加權(quán)平均數(shù)国瓮,分別提供了mean(arr)
、media(arr)
狞谱、average(arr)
乃摹,也可以指定計(jì)算某個(gè)軸上的平均數(shù)、中位數(shù)跟衅、加權(quán)平均數(shù)孵睬。
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
# 權(quán)重,加權(quán)平均數(shù)時(shí)用到了
weights = np.array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 2]])
print(arr_2d)
print(weights)
print("平均數(shù){}".format(np.mean(arr_2d)))
print("中位數(shù){}".format(np.median(arr_2d)))
print("加權(quán)平均數(shù){}".format(np.average(arr_2d, weights=weights)))
運(yùn)算結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 2]]
平均數(shù)5.5
中位數(shù)5.5
加權(quán)平均數(shù)5.923076923076923
- 累和
numpy中求累和提供了cumsum
,可以計(jì)算一個(gè)數(shù)組中求累和np.cumsum(arr)
伶跷,也可以指定計(jì)算某個(gè)軸上求累和np.cumsum(arr掰读,axis=0或1或2等)
。
import numpy as np
arr1 = np.arange(6)
print(arr1)
# 求累和
print(np.cumsum(arr1))
運(yùn)算結(jié)果:
[0 1 2 3 4 5]
[ 0 1 3 6 10 15]
累和計(jì)算規(guī)則如圖:
- 累差
numpy中求累和提供了diff
叭莫,可以計(jì)算一個(gè)數(shù)組中求累和np.diff(arr)
蹈集,也可以指定計(jì)算某個(gè)軸上求累和np.diff(arr,axis=0或1或2等)
雇初。
import numpy as np
arr1 = np.array([1, 3, 5, 2, 4, 6])
print(arr1)
# 求累差
print(np.diff(arr1))
運(yùn)行結(jié)果:
[1 3 5 2 4 6]
[ 2 2 -3 2 2]
- 非零元素
numpy中找一個(gè)數(shù)組中非零元素提供了np.nonzero(arr)
拢肆,示例如下:
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)
print(np.nonzero(arr_2d))
運(yùn)行結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64),
array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
解析:調(diào)用非零元素方法得到了(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
,由于原數(shù)組是2維的靖诗,所以打印結(jié)果中這個(gè)包含兩個(gè)數(shù)組郭怪,分別表示:非零元素所在的行的索引組成的數(shù)組,非零元素所在的列的索引組成的數(shù)組呻畸。
可以看到除了(0,0)
處的元素外移盆,其余都非零,所以有上面的打印結(jié)果伤为。
- 排序
numpy中排序提供了sort
咒循,可以指定某個(gè)軸上元素排序np.sort(arr赊窥,axis=0或1或2等)
薯鼠,也可以指定排序使用的方法,kind
數(shù)組排序時(shí)使用的方法枉长。
a :所需排序的數(shù)組
axis:數(shù)組排序時(shí)的基準(zhǔn)位衩,axis=0裆蒸,按行排列;axis=1糖驴,按列排列
kind:數(shù)組排序時(shí)使用的方法僚祷,其中: kind= ′ quicksort ′ 為快排佛致;kind= ′ mergesort ′ 為混排;kind= ′ heapsort ′ 為堆排辙谜;
order:一個(gè)字符串或列表俺榆,可以設(shè)置按照某個(gè)屬性進(jìn)行排序。
import numpy as np
arr1 = np.array([[1, 13, 5, 12, 4, 6],
[10, 11, 12, 7, 8, 9]])
print(arr1)
print("-" * 20)
print(np.sort(arr1))
print("-" * 20)
# axis=0 對(duì)每一列中的元素排序
print(np.sort(arr1, axis=0, kind="quicksort"))
print("-" * 20)
# axis=1 對(duì)每一行中的元素排序
print(np.sort(arr1, axis=1))
運(yùn)行結(jié)果:
[[ 1 13 5 12 4 6]
[10 11 12 7 8 9]]
--------------------
[[ 1 4 5 6 12 13]
[ 7 8 9 10 11 12]]
--------------------
[[ 1 11 5 7 4 6]
[10 13 12 12 8 9]]
--------------------
[[ 1 4 5 6 12 13]
[ 7 8 9 10 11 12]]
- 矩陣的轉(zhuǎn)置
numpy對(duì)矩陣的轉(zhuǎn)置提供了多種實(shí)現(xiàn)方式装哆,最常用的arr.T
和np.transpose(arr)
罐脊。需要注意的是,numpy提供了迭代行蜕琴,并沒有提供直接迭代列萍桌。若要迭代列,一般都是先轉(zhuǎn)置一下再迭代行就行了凌简。
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)
print("-" * 20)
# 矩陣的轉(zhuǎn)置,方式1
print(arr_2d.T)
print("-" * 20)
# 矩陣的轉(zhuǎn)置,方式2
print(np.transpose(arr_2d))
運(yùn)行結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
--------------------
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
--------------------
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
- 數(shù)據(jù)裁剪處理
numpy對(duì)數(shù)組中的元素提供了裁剪處理的方法np.clip(arr, min, max)
上炎, 對(duì)該函數(shù)的理解:小于最小值得按最小值處理;大于最大值的按最大值處理号醉,處于最小值和最大值之間的保留原數(shù)據(jù)反症。示例如下:
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)
# 數(shù)據(jù)的裁剪
print(np.clip(arr_2d, 5, 8))
運(yùn)行結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[5 5 5 5]
[5 5 6 7]
[8 8 8 8]]
- 展開鋪平
numpy對(duì)數(shù)組中可以重新定義shape
, 方法是reshape(shape)
辛块,也提供了降維處理畔派,直接展開鋪平為一維arr.flatten()
。示例如下:
import numpy as np
arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)
# 展開鋪平操作
print(arr_2d.flatten())
運(yùn)行結(jié)果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ 0 1 2 3 4 5 6 7 8 9 10 11]
2.array合并
數(shù)組的合并润绵,分為在垂直方向合并np.vstack((arr1, arr2))
和在水平方向合并np.hstack((arr1, arr2))
线椰。
import numpy as np
arr1 = np.array([1, 1, 1])
arr2 = np.array([2, 2, 2])
print(arr1)
print("-" * 10)
print(arr2)
print("在列方向合并:")
print(np.vstack((arr1, arr2)))
print("在行方向合并:")
print(np.hstack((arr1, arr2)))
運(yùn)行結(jié)果:
[1 1 1]
----------
[2 2 2]
在列方向合并:
[[1 1 1]
[2 2 2]]
在行方向合并:
[1 1 1 2 2 2]
當(dāng)然,也可以使用np.concatenate((arr1, arr2), axis=0或1或2等)
:
import numpy as np
arr1 = np.array([[1, 2],
[3, 4]])
arr2 = np.array([[5, 6]])
print(arr1)
print("-" * 10)
print(arr2)
print("在垂直方向合并:")
print(np.concatenate((arr1, arr2), axis=0))
print("在水平方向合并:")
print(np.concatenate((arr1, arr2.T), axis=1))
運(yùn)行結(jié)果:
[[1 2]
[3 4]]
----------
[[5 6]]
在列方向合并:
[[1 2]
[3 4]
[5 6]]
在行方向合并:
[[1 2 5]
[3 4 6]]
3.array分割
數(shù)組的拆分尘盼,分為在垂直方向拆分np.vsplit(arr1, 幾等分)
和在水平方向拆分np.hsplit(arr1, 幾等分)
憨愉。
import numpy as np
arr_2d = np.arange(24).reshape((4, 6))
print(arr_2d)
# 在垂直方向上等分2份
print(np.vsplit(arr_2d, 2))
# 在水平方向上等分2份
print(np.hsplit(arr_2d, 2))
運(yùn)行結(jié)果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
[array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]]),
array([[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17],
[21, 22, 23]])]
當(dāng)然,也可以使用np.split(arr1, axis=0或1或2等)
:
import numpy as np
arr_2d = np.arange(24).reshape((4, 6))
print(arr_2d)
# 在垂直方向上等分2份
print(np.split(arr_2d, 2, axis=0))
# 在水平方向上等分3份
print(np.split(arr_2d, 3, axis=1))
運(yùn)行結(jié)果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
[array([[ 0, 1],
[ 6, 7],
[12, 13],
[18, 19]]),
array([[ 2, 3],
[ 8, 9],
[14, 15],
[20, 21]]),
array([[ 4, 5],
[10, 11],
[16, 17],
[22, 23]])]
4.array的copy
numpy中數(shù)組的賦值操作卿捎,默認(rèn)是不進(jìn)行拷貝的配紫。下面例子中,arr1 和arr2指向了內(nèi)存中的同一內(nèi)存地址午阵,是不同變量指向了同一對(duì)象躺孝。
import numpy as np
# 創(chuàng)建數(shù)組arr1
arr1 = np.array([[1, 2, 3],
[4, 5, 6]])
# 把數(shù)組arr1賦值給數(shù)組arr2,
arr2 = arr1
print(arr1)
print(arr2)
# arr1和arr2是否同一對(duì)象
print(arr1 is arr2)
運(yùn)行結(jié)果:
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
True
通過(guò)一個(gè)變量修改數(shù)組的值底桂,由于兩個(gè)數(shù)組變量指向同一對(duì)象植袍,所以另一處的值也是被修改后的:
# 上接
arr1[1][1] = 15
print(arr1)
print(arr2)
運(yùn)行結(jié)果:
[[ 1 2 3]
[ 4 15 6]]
[[ 1 2 3]
[ 4 15 6]]
上面例子中,之前一處兩個(gè)變量指向的同一數(shù)組籽懦,數(shù)據(jù)發(fā)生了變化于个。是因?yàn)?code>arr2 = arr1這句賦值操作默認(rèn)采用的不拷貝。暮顺,如果厅篓,我想讓arr1和arr2是獨(dú)立的存在秀存,當(dāng)一處修改,另一處數(shù)據(jù)不變動(dòng)羽氮。那么只需要賦值時(shí)采用copy
復(fù)制一份即可应又。代碼如下:
import numpy as np
# 創(chuàng)建數(shù)組arr1
arr1 = np.array([[1, 2, 3],
[4, 5, 6]])
# 把數(shù)組arr1賦值給數(shù)組arr2,
arr2 = arr1.copy()
print(arr1)
print(arr2)
# arr1和arr2是否同一對(duì)象
print("arr1和arr2是否同一對(duì)象:{}".format(arr1 is arr2))
# 修改arr1[1][1]的元素的值為15
arr1[1][1] = 15
print(arr1)
print(arr2)
運(yùn)行結(jié)果:
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
arr1和arr2是否同一對(duì)象:False
[[ 1 2 3]
[ 4 15 6]]
[[1 2 3]
[4 5 6]]
說(shuō)明:arr2 = arr1.copy()
復(fù)制后乏苦,arr2
和 arr1
就相互獨(dú)立株扛,一個(gè)數(shù)據(jù)修改不再影響另一個(gè)數(shù)組中的數(shù)據(jù)了。
索引操作
numpy中數(shù)組是矩陣的基礎(chǔ)汇荐,兩種可以相互轉(zhuǎn)化洞就。數(shù)組操作中,索引的處理決定了操作哪些元素掀淘,因此索引操作變得至關(guān)重要旬蟋。
一維數(shù)組,形如arr1=[0, 1, 2, 3, 4]
革娄,arr1[1]
拿到的是元素1
;
一維數(shù)組倾贰,形如
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
此時(shí)arr1[1]
拿到的是第1整行:[ 5 6 7 8 9]
;
arr1[1][1]
拿到的是元素6
;
arr1[:, 1]
拿到的是第1整列:[ 1 6 11]
;
arr1[1, 1:3]
拿到的是第1行第1~3列的元素:[ 6 7]
;
方差、標(biāo)準(zhǔn)差
numpy提供了計(jì)算方差拦惋、標(biāo)準(zhǔn)差的函數(shù)匆浙,在統(tǒng)計(jì)計(jì)算時(shí)非常有用:
計(jì)算數(shù)組的極差:np.pth(a)=max(a)-min(a)
計(jì)算方差(總體方差):np.var(a)
標(biāo)準(zhǔn)差:np.std(a)
import numpy as np
arr = np.arange(15).reshape((3, 5))
print(arr)
# 方差
print(np.var(arr))
# 標(biāo)準(zhǔn)差
print(np.std(arr))
運(yùn)行結(jié)果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
18.666666666666668
4.320493798938574
多項(xiàng)式
多項(xiàng)式擬合:poly= np.polyfit(x,a,n)
,擬合點(diǎn)集a
得到n
級(jí)多項(xiàng)式,其中x
為橫軸長(zhǎng)度厕妖,返回多項(xiàng)式的系數(shù)
多項(xiàng)式求導(dǎo)函數(shù):np.polyder(poly)
,返回導(dǎo)函數(shù)的系數(shù)
得到多項(xiàng)式的n階導(dǎo)函數(shù):多項(xiàng)式.deriv(m = n)
多項(xiàng)式求根:np.roots(poly)
多項(xiàng)式在某點(diǎn)上的值:np.polyval(poly,x[n])
,返回poly
多項(xiàng)式在橫軸點(diǎn)上x[n]
上的值
兩個(gè)多項(xiàng)式做差運(yùn)算: np.polysub(a,b)
線性代數(shù)基礎(chǔ)運(yùn)算
估計(jì)線性模型中的系數(shù):a=np.linalg.lstsq(x,b),有b=a*x
求方陣的逆矩陣:np.linalg.inv(A)
求廣義逆矩陣:np.linalg.pinv(A)
求矩陣的行列式:np.linalg.det(A)
解形如AX=b的線性方程組:np.linalg.solve(A,b)
求矩陣的特征值:np.linalg.eigvals(A)
求特征值和特征向量:np.linalg.eig(A)
Svd分解:np.linalg.svd(A)
概率分布
產(chǎn)生二項(xiàng)分布的隨機(jī)數(shù):np.random.binomial(n,p,size=…)
首尼,其中n,p,size
分別是每輪試驗(yàn)次數(shù)、概率言秸、輪數(shù)
產(chǎn)生超幾何分布隨機(jī)數(shù):np.random.hypergeometric(n1,n2,n,size=…)
软能,其中參數(shù)意義分別是物件1總量、物件2總量举畸、每次采樣數(shù)查排、試驗(yàn)次數(shù)
產(chǎn)生N個(gè)正態(tài)分布的隨機(jī)數(shù):np.random.normal(均值,標(biāo)準(zhǔn)差抄沮,N)
產(chǎn)生N個(gè)對(duì)數(shù)正態(tài)分布的隨機(jī)數(shù):np.random.lognormal(mean,sigma,N)
小結(jié)
本文學(xué)習(xí)了numpy的常用用法跋核,具體包括:如何安裝及導(dǎo)入numpy、數(shù)組的重要屬性合是、數(shù)組的多種創(chuàng)建方式了罪、數(shù)組的常見操作、數(shù)組的合并聪全、拆分泊藕;索引操作、多項(xiàng)式、方差娃圆、標(biāo)準(zhǔn)差玫锋、概率分布等知識(shí)。這一節(jié)知識(shí)是后面學(xué)習(xí)Pandas
和TensorFlow
的基礎(chǔ)讼呢,務(wù)必掌握撩鹿。
參考資料:NumPy官網(wǎng)教程(英文)