點(diǎn)擊上方Python知識(shí)圈,設(shè)為星標(biāo)

numpy(Numerical Python)是一個(gè)開源的Python數(shù)據(jù)科學(xué)計(jì)算庫(kù),支持對(duì)N維數(shù)組和矩陣的操作,用于快速處理任意維度的數(shù)組。
numpy庫(kù)的功能非常聚焦,專注于做好“一件事”。numpy主要使用ndarray來(lái)處理N維數(shù)組,numpy中的大部分屬性和方法都是為ndarray服務(wù)的。所以,掌握了ndarray的用法,基本就掌握了numpy的用法。
ndarray是一個(gè)N維數(shù)組類型的對(duì)象,與python的基本數(shù)據(jù)類型列表相比,同一個(gè)ndarray中所有元素的數(shù)據(jù)類型都相同,而列表中可以存儲(chǔ)不同類型的數(shù)據(jù)。ndarray在存儲(chǔ)的數(shù)據(jù)類型上做限制,換取了運(yùn)算效率的提升和數(shù)據(jù)處理的便捷,在數(shù)據(jù)分析中非常實(shí)用。import numpy as np
array_a = np.array([[1, 2, 3], [4, 5, 6]])print(array_a)print('ndarray的維度: ', array_a.ndim)print('ndarray的形狀: ', array_a.shape)print('ndarray的元素?cái)?shù)量: ', array_a.size)print('ndarray中的數(shù)據(jù)類型: ', array_a.dtype)print(type(array_a))
[[1 2 3] [4 5 6]]ndarray的維度: 2ndarray的形狀: (2, 3)ndarray的元素?cái)?shù)量: 6ndarray中的數(shù)據(jù)類型: int32<class 'numpy.ndarray'>
ndarray有很多屬性和方法,可以用dir()內(nèi)置方法將他們打印出來(lái)。本文先從屬性開始介紹。
shape屬性表示ndarray的形狀,是一個(gè)元組,表示數(shù)組有幾維,每個(gè)維度有多少個(gè)數(shù)據(jù)。ndim屬性表示數(shù)組的維度。size屬性表示數(shù)組中的元素個(gè)數(shù),size可以通過(guò)shape中的值相乘得到。dtype屬性表示數(shù)組中保存的數(shù)據(jù)類型。從Python解釋器的角度看,ndarray屬于numpy.ndarray對(duì)象。
二、ndarray的維度和形狀
為了更好地理解ndarray,可以先看它的維度和形狀。array_b = np.array([1, 1, 1])array_c = np.array([[2, 2, 2], [2, 2, 2]])array_d = np.array([[[3, 3, 3], [3, 3, 3]], [[3, 3, 3], [3, 3, 3]]])print(array_b, '\n{}'.format(array_c), '\n{}'.format(array_d))print(array_b.shape, array_c.shape, array_d.shape)
[1 1 1] [[2 2 2] [2 2 2]] [[[3 3 3] [3 3 3]] [[3 3 3] [3 3 3]]](3,) (2, 3) (2, 2, 3)
array_b是一個(gè)一維數(shù)組,數(shù)組中有三個(gè)數(shù)據(jù)。array_c是一個(gè)二維數(shù)組,數(shù)組中有2*3個(gè)數(shù)據(jù)。array_d是一個(gè)三維數(shù)組,數(shù)組中有2*2*3個(gè)數(shù)據(jù)。所以它們的形狀分別是(3,) 、(2, 3)和 (2, 2, 3)。用圖形表示如下:

從一維到三維的變化,可以幫助我們理解ndarray的維度和形狀變化。ndarray的維度可以是N維,從4維開始,不方便用圖形來(lái)展示,會(huì)稍微抽象一點(diǎn)。
從Python中的數(shù)據(jù)表示方式來(lái)看,N維數(shù)組的顯示結(jié)果與列表相同,每多嵌套一層,就代表多一個(gè)維度。根據(jù)上面例子中的數(shù)據(jù),依次類推,可以表示出更多維度的ndarray數(shù)據(jù)。
前面已經(jīng)提到,在一個(gè)ndarray對(duì)象中,存儲(chǔ)的是同一類型的數(shù)據(jù),ndarray中常見的數(shù)據(jù)類型有下表這些。| 名稱 | 描述 | 簡(jiǎn)寫 |
|---|
| np.bool | 用一個(gè)字節(jié)存儲(chǔ)的布爾類型(True或False),在數(shù)據(jù)分析中很常用。 | 'b' |
| np.int8 | 一個(gè)字節(jié)大小,-128至127,不常用。 | 'i' |
| np.int16 | 整數(shù),-32768至32767,不常用。 | 'i2' |
| np.int32 | 整數(shù),-2^31至2^32-1,常用。 | 'i4' |
| np.int64 | 整數(shù),-2^63至2^63-1,常用,一般整數(shù)默認(rèn)為np.int64或np.int32。 | 'i8' |
| np.uint8 | 無(wú)符號(hào)整數(shù),0至255,不常用。 | 'u' |
| np.uint16 | 無(wú)符號(hào)整數(shù),0至65535,不常用。 | 'u2' |
| np.uint32 | 無(wú)符號(hào)整數(shù),0至2^32-1,常用。 | 'u4' |
| np.uint64 | 無(wú)符號(hào)整數(shù),0至2^64-1,常用。 | 'u8' |
| np.float16 | 16位半精度浮點(diǎn)數(shù),正負(fù)號(hào)1位,指數(shù)5位,精度10位,不常用。 | 'f2' |
| np.float32 | 32位單精度浮點(diǎn)數(shù),正負(fù)號(hào)1位,指數(shù)8位,精度23位,不常用。 | 'f4' |
| np.float64 | 64位雙精度浮點(diǎn)數(shù),正負(fù)號(hào)1位,指數(shù)11位,精度52位,常用。 | 'f8' |
| np.complex64 | 復(fù)數(shù),分別用兩個(gè)32位浮點(diǎn)數(shù)表示實(shí)部和虛部,基本不會(huì)用。 | 'c8' |
| np.complex128 | 復(fù)數(shù),分別用兩個(gè)64位浮點(diǎn)數(shù)表示實(shí)部和虛部,基本不會(huì)用。 | 'c16' |
| np.object_ | python對(duì)象,常用。 | 'O' |
| np.string_ | 字符串,常用。 | 'S' |
| np.unicode_ | unicode類型,不常用。 | 'U' |
四、修改ndarray的形狀和數(shù)據(jù)類型
array_e = np.array([[1, 2, 3], [4, 5, 6]])print(array_e, array_e.shape)array_e1 = array_e.reshape((3, 2))print(array_e1, array_e1.shape)array_e2 = array_e.Tprint(array_e2, array_e2.shape)
[[1 2 3] [4 5 6]] (2, 3)[[1 2] [3 4] [5 6]] (3, 2)[[1 4] [2 5] [3 6]] (3, 2)
reshape(shape[, order]): 修改ndarray的形狀。修改數(shù)組的形狀時(shí),不能改變數(shù)組中的元素個(gè)數(shù),如上面的數(shù)組形狀是(2, 3),可以修改成(3, 2)或(1, 6)、(6, 1),修改形狀后仍然是6個(gè)元素。
ndarray.T: 將ndarray轉(zhuǎn)置(行和列交換,行變成列,列變成行)。 對(duì)比上面的兩次修改,reshape()和.T轉(zhuǎn)換后數(shù)組的形狀都是(3, 2),但數(shù)據(jù)的排列方式不一樣,reshape()修改的結(jié)果沒有改變數(shù)據(jù)的先后順序,.T的結(jié)果是將行變成列,列變成行。
2. 修改ndarray的數(shù)據(jù)類型
array_f = np.array([[1, 2, 3], [4, 5, 6]])print(array_f, array_f.dtype)array_f1 = array_f.astype(np.int64)print(array_f1, array_f1.dtype)
[[1 2 3] [4 5 6]] int32[[1 2 3] [4 5 6]] int64
astype(dtype[, order, casting, subok, copy]): 修改ndarray中的數(shù)據(jù)類型。傳入需要修改的數(shù)據(jù)類型,其他關(guān)鍵字參數(shù)可以不關(guān)注。
五、ndarray的多種生成和創(chuàng)建方法
array_g = np.ones((2, 3), order='F')print(array_g, array_g.dtype)array_h = np.zeros((3, 3), dtype='int64')print(array_h, array_h.dtype)array_i = np.ones_like([[1, 2, 3], [4, 5, 6]])print(array_i, array_i.dtype)array_j = np.zeros_like([[1, 2, 3], [4, 5, 6]])print(array_j, array_j.dtype)
[[1. 1. 1.] [1. 1. 1.]] float64[[0 0 0] [0 0 0] [0 0 0]] int64[[1 1 1] [1 1 1]] int32[[0 0 0] [0 0 0]] int32
ones(shape[, dtype, order]): 生成全為1的ndarray。shape為必傳參數(shù),表示生成的數(shù)組的形狀。dtype表示數(shù)組中存儲(chǔ)的數(shù)據(jù)類型,默認(rèn)為float64,可以指定數(shù)據(jù)類型。order表示數(shù)組的秩序,表示存儲(chǔ)的數(shù)據(jù)是以行為主還是以列為主(兩種風(fēng)格),通常不關(guān)注此參數(shù)。zeros(shape[, dtype, order]): 生成全為0的ndarray。參數(shù)同ones()。ones_like(a[, dtype, order, subok]): 生成全為1的ndarray,形狀與已知數(shù)組相同。a為必傳參數(shù),傳入一個(gè)形似array的數(shù)據(jù)(array_like,通常是嵌套列表或數(shù)組)。dtype表示數(shù)組中存儲(chǔ)的數(shù)據(jù)類型,默認(rèn)與傳入的數(shù)組相同。另外兩個(gè)參數(shù)通常不關(guān)注。
zeros_like(a[, dtype, order, subok]): 生成全為0的ndarray,形狀與已知數(shù)組相同。參數(shù)同ones_like()。
array_k = np.full((2, 3), 2)print(array_k, array_k.dtype)array_l = np.full_like([[1, 2, 3], [4, 5, 6]], 3)print(array_l, array_l.dtype)array_m = np.empty((2, 3))print(array_m, array_m.dtype)array_n = np.empty((2, 4))print(array_n, array_n.dtype)
[[2 2 2] [2 2 2]] int32[[3 3 3] [3 3 3]] int32[[1. 1. 1.] [1. 1. 1.]] float64[[6.23042070e-307 4.67296746e-307 1.69121096e-306 1.33511562e-306] [1.37962660e-306 8.34441742e-308 1.42420481e-306 1.24612013e-306]] float64
full(shape, fill_value[, dtype, order]): 生成全為指定值的ndarray。shape為必傳參數(shù),表示生成的數(shù)組的形狀。fill_value為必傳參數(shù),表示指定的填充值。
full_like(a, fill_value[, dtype, order, subok]): 生成全為指定值的ndarray,形狀與已知數(shù)組相同。a為必傳參數(shù),傳入一個(gè)形似array的數(shù)據(jù)。fill_value為必傳參數(shù),表示指定的填充值。
empty(shape[, dtype, order]): 生成全為空值的ndarray。如果內(nèi)存空間中存在一個(gè)數(shù)組,與生成的空數(shù)組形狀和數(shù)據(jù)類型都相同,則生成的空數(shù)組會(huì)直接指向存在的數(shù)組。如果要生成一個(gè)完全為空的數(shù)組,需要先將內(nèi)存中形狀和數(shù)據(jù)類型都相同的數(shù)組清除,或使空數(shù)組的形狀或數(shù)據(jù)類型與已存在的數(shù)組不同,這樣才能新開辟內(nèi)存空間,生成真正的空數(shù)組,打印空數(shù)組的結(jié)果是內(nèi)存編碼。與前面的函數(shù)相似,也有對(duì)應(yīng)的empty_like(a[, dtype, order, subok])函數(shù)。
array_o = np.arange(1, 10, 2)array_p = np.linspace(0, 20, 5, retstep=True)array_q = np.linspace(array_o, 5, 3)array_r = np.logspace(0, 100, 6)print(array_o, '\n{}'.format(array_p), '\n{}'.format(array_q), '\n{}'.format(array_r))
[1 3 5 7 9] (array([ 0., 5., 10., 15., 20.]), 5.0) [[1. 3. 5. 7. 9.] [3. 4. 5. 6. 7.] [5. 5. 5. 5. 5.]] [1.e+000 1.e+020 1.e+040 1.e+060 1.e+080 1.e+100]
arange(start, stop, step[, dtype]): 給定起始值、結(jié)束值(不包含結(jié)束值)和步長(zhǎng),生成指定范圍的一維數(shù)組,效果相當(dāng)于Python內(nèi)置函數(shù)range()。
linspace(start, stop[, num, endpoint, retstep, dtype, axis]): 給定起始值、結(jié)束值,生成等間隔的一維數(shù)組。start表示數(shù)組的起始值。stop表示數(shù)組的終止值。num表示生成數(shù)組中的數(shù)據(jù)個(gè)數(shù),默認(rèn)為50。endpoint表示數(shù)組中是否包含stop值,默認(rèn)為Ture。retstep表示是否返回?cái)?shù)組的步長(zhǎng),默認(rèn)為False。dtype表示ndarray中的數(shù)據(jù)類型。
linspace()中的start或stop也可以傳入形似array的數(shù)據(jù),此時(shí)可生成二維數(shù)組。axis參數(shù)此時(shí)可以派上用場(chǎng),表示將array_like的數(shù)據(jù)作為行還是作為列來(lái)生成二維數(shù)組,默認(rèn)為0時(shí)作為行,如果為-1則作為列。
logspace(start, stop[, num, endpoint, base, dtype, axis]): 給定起始值、結(jié)束值,生成等間隔的一維數(shù)組,數(shù)據(jù)為對(duì)數(shù)函數(shù)log的值。base表示log函數(shù)的底數(shù),默認(rèn)為10。其他參數(shù)同linspace()。
array_s = np.random.randint(1, 10, 5)array_t = np.random.rand(5)array_u = np.random.uniform(size=5)array_v = np.random.randn(5)array_w = np.random.normal(10, 1, 5)print(array_s, '\n{}'.format(array_t), '\n{}'.format(array_u), '\n{}'.format(array_v), '\n{}'.format(array_w))
[1 7 4 2 8] [0.68173299 0.92899918 0.01771993 0.03010565 0.74799694] [0.97895281 0.67811682 0.15493234 0.04435618 0.15152692] [ 1.24094827 1.27898853 -1.42507622 1.97560767 -0.43269307] [11.24927114 10.07827993 9.83908081 10.94827526 10.14160875]
np.random.randint(low, high=None, size=None, dtype=None): 給定起始值、結(jié)束值(不包含結(jié)束值)和數(shù)據(jù)個(gè)數(shù),從指定范圍內(nèi)生成指定個(gè)數(shù)(每次生成一個(gè),共size次)的整數(shù),組成一個(gè)一維數(shù)組。
np.random.rand(): 生成一個(gè)0到1(不包含1)之間的隨機(jī)數(shù),如果傳入生成的數(shù)據(jù)個(gè)數(shù),則生成一維數(shù)組,數(shù)組中的每個(gè)值都是0到1之間的隨機(jī)數(shù)。
np.random.uniform(low=0.0, high=1.0, size=None): 給定起始值、結(jié)束值(不包含結(jié)束值)和數(shù)據(jù)個(gè)數(shù),從指定范圍內(nèi)生成指定個(gè)數(shù)的小數(shù),組成一維數(shù)組。默認(rèn)同rand()。
這三個(gè)函數(shù)在生成隨機(jī)數(shù)組時(shí),數(shù)據(jù)范圍內(nèi)的每個(gè)數(shù)概率相等,數(shù)據(jù)是均勻分布的。
np.random.randn(): 按標(biāo)準(zhǔn)正太分布(均值為0,標(biāo)準(zhǔn)差為1)生成一個(gè)隨機(jī)數(shù)。如果傳入生成的數(shù)據(jù)個(gè)數(shù),則生成一維數(shù)組。
np.random.normal(loc=0.0, scale=1.0, size=None): 給定均值、標(biāo)準(zhǔn)差和數(shù)據(jù)個(gè)數(shù),按正太分布的概率生成指定個(gè)數(shù)的數(shù),組成一個(gè)一維數(shù)組。
randn()和normal()函數(shù)生成的隨機(jī)數(shù)組中,數(shù)據(jù)是正太分布的。
除了直接創(chuàng)建新的數(shù)組,也可以復(fù)制已有的數(shù)組。array_x = np.array([(5, 5, 5), [5, 5, 5]])array_y = np.asarray(array_x)array_z = np.copy(array_x)print(array_x, '\n{}'.format(array_y), '\n{}'.format(array_z))
[[5 5 5] [5 5 5]] [[5 5 5] [5 5 5]] [[5 5 5] [5 5 5]]
array(object[, dtype, copy, order, subok, ndmin]): 創(chuàng)建一個(gè)數(shù)組,傳入一個(gè)形似array的數(shù)據(jù)。在最開始介紹ndarray屬性時(shí),就是用array()創(chuàng)建數(shù)組。
asarray(a[, dtype, order]): 將輸入的數(shù)據(jù)轉(zhuǎn)換為一個(gè)數(shù)組,輸入一個(gè)嵌套列表或數(shù)組,可以用此函數(shù)來(lái)實(shí)現(xiàn)拷貝數(shù)組。asarray()還有幾個(gè)延伸的函數(shù)asanyarray(a[, dtype, order]),ascontiguousarray(a[, dtype])和asmatrix(data[, dtype])。
copy(a[, order]): 拷貝數(shù)組。copy()函數(shù)是深拷貝,asarray()函數(shù)是淺拷貝,下面驗(yàn)證一下。array_x[0][1] = 6print(array_x, '\n{}'.format(array_y), '\n{}'.format(array_z))
[[5 6 5] [5 5 5]] [[5 6 5] [5 5 5]] [[5 5 5] [5 5 5]]
被拷貝的數(shù)組中所有數(shù)據(jù)都是5,用asarray()和copy()函數(shù)拷貝的數(shù)組也一樣。修改被拷貝數(shù)組中第一維第二個(gè)數(shù)據(jù)為6后,asarray()函數(shù)拷貝的數(shù)組中也變成了6,copy()函數(shù)拷貝的數(shù)組中還是5,說(shuō)明asarray()函數(shù)是淺拷貝,copy()函數(shù)是深拷貝。
array1 = np.array([[[1, 2, 3, 4], [3, 4, 5, 6]], [[7, 8, 9, 10], [9, 10, 11, 12]]])print(array1, array1.shape)print(array1[1])print(array1[1][0])print(array1[1, 0])print(array1[0, :1, 1:3])
[[[ 1 2 3 4] [ 3 4 5 6]] [[ 7 8 9 10] [ 9 10 11 12]]] (2, 2, 4)[[ 7 8 9 10] [ 9 10 11 12]][ 7 8 9 10][ 7 8 9 10][[2 3]]
ndarray的索引和切片與Python列表的方式相同,可以直接用列表的語(yǔ)法對(duì)ndarray進(jìn)行索引和切片操作。另外,numpy中還有特殊的索引和切片語(yǔ)法,如array[1, 0]與array[1][0]的結(jié)果一樣。
array2 = np.unique(array1)print(array2)
[ 1 2 3 4 5 6 7 8 9 10 11 12]
unique(ar, [return_index, return_inverse, return_counts, axis]): 對(duì)ndarray去重。默認(rèn)是對(duì)整個(gè)數(shù)組去重,返回一個(gè)一維數(shù)組。也可以使用axis參數(shù)指定按行還是按列去重。
七、ndarray的運(yùn)算
1. 邏輯運(yùn)算
array3 = np.array([[1, 2, 3], [4, 5, 6]])print(np.all(array3 > 1))print(np.any(array3 > 1))
ndarray可以直接與整數(shù)進(jìn)行比較,判斷大小,返回布爾值。
all(a[, axis, out, keepdims]): 當(dāng)ndarray中的所有元素都滿足邏輯判斷時(shí),返回真,否則返回假。如數(shù)組[[1, 2, 3], [4, 5, 6]] > 1當(dāng)且僅當(dāng)所有數(shù)都大于1時(shí),才為真。
any(a[, axis, out, keepdims]): 只要ndarray中有一個(gè)元素滿足邏輯判斷,返回真,全都不滿足時(shí)返回假。如數(shù)組[[1, 2, 3], [4, 5, 6]] > 1只要有一個(gè)數(shù)大于1,就為真。
array4 = np.where(array3 > 3, 1, 0)print(array4)array5 = np.where(np.logical_and(array3 > 2, array3 < 5), 1, 0)print(array5)array6 = np.where(np.logical_or(array3 < 2, array3 > 5), 1, 0)print(array6)
[[0 0 0] [1 1 1]][[0 0 1] [1 0 0]][[1 0 0] [0 0 1]]
where(condition, x=None, y=None): 對(duì)ndarray中的所有數(shù)據(jù)進(jìn)行邏輯運(yùn)算,邏輯為真的位置賦值為x,邏輯為假的位置賦值為y,實(shí)現(xiàn)三目運(yùn)算。如果需要進(jìn)行復(fù)合邏輯運(yùn)算,可以使用np.logical_and()、np.logical_not()、np.logical_or()或np.logical_xor()來(lái)連接,分別表示邏輯與、邏輯非、邏輯或和邏輯異或(同真同假為假,一真一假為真)。
array7 = np.array([[1, 3, 5], [7, 9, 11]])print('最小值:', np.min(array7), np.min(array7, axis=0))print('最大值:', np.max(array7), np.max(array7, axis=1))print('中位數(shù):', np.median(array7))print('平均值:', np.mean(array7))print('標(biāo)準(zhǔn)差:', np.std(array7))print('方差:', np.var(array7))print('最小值的索引:', np.argmin(array7))print('最大值的索引:', np.argmax(array7))
最小值:1 [1 3 5]最大值:11 [ 5 11]中位數(shù):6.0平均值:6.0標(biāo)準(zhǔn)差:3.415650255319866方差:11.666666666666666最小值的索引:0最大值的索引:5
min(a[, axis, out, keepdims, initial, where]): 返回ndarray中的最小值。實(shí)際調(diào)用的是amin()函數(shù)。如果設(shè)置axis為0,則計(jì)算每一列的最小值,axis為1,則計(jì)算每一行的最小值。
max(a[, axis, out, keepdims, initial, where]): 返回ndarray中的最大值。實(shí)際調(diào)用的是amax()函數(shù)。
median(a[, axis, out, overwrite_input, keepdims]): 返回ndarray中的中位數(shù)。
mean(a[, axis, dtype, out, keepdims]): 返回ndarray的平均值。
std(a[, axis, dtype, out, ddof, keepdims]): 返回ndarray的標(biāo)準(zhǔn)差。
var(a[, axis, dtype, out, ddof, keepdims]): 返回ndarray的方差。
argmin(a[, axis, out]): 返回ndarray中最小值的索引。
argmax(a[, axis, out]): 返回ndarray中最大值的索引。
上面的所有函數(shù)中,axis參數(shù)的用法都相同。
八、ndarray之間的運(yùn)算
1. ndarray與數(shù)字和ndarray之間的運(yùn)算
array8 = np.array([[1, 2, 3], [4, 5, 6]])print(array8 + 2)array9 = np.array([[2, 2, 2], [2, 2, 2]])print(array8 * array9)
[[3 4 5] [6 7 8]][[ 2 4 6] [ 8 10 12]]
ndarray可以直接與數(shù)字進(jìn)行算術(shù)運(yùn)算,注意乘法運(yùn)算與列表的乘法運(yùn)算不同,列表與數(shù)字相乘是拼接,而ndarray與數(shù)字相乘是數(shù)組中的每一個(gè)數(shù)據(jù)與數(shù)字相乘生成一個(gè)新數(shù)組。
兩個(gè)形狀相同的數(shù)組之間也可以直接進(jìn)行算術(shù)運(yùn)算,運(yùn)算的結(jié)果是將兩個(gè)數(shù)組索引相同的數(shù)據(jù)進(jìn)行算術(shù)運(yùn)行,生成一個(gè)新數(shù)組。
array10 = np.array([[[1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1]]])print(array8 * array10)
[[[1 2 3] [4 5 6]] [[1 2 3] [4 5 6]]]
當(dāng)兩個(gè)數(shù)組的形狀不相同時(shí),要將他們進(jìn)行運(yùn)算,numpy會(huì)嘗試進(jìn)行廣播。廣播是將兩個(gè)數(shù)組的形狀元組值從后往前逐個(gè)進(jìn)行比較,如果元組中的值相等、其中一個(gè)為1或其中一個(gè)不存在,則兩個(gè)數(shù)組可以進(jìn)行運(yùn)算,生成一個(gè)兼容兩個(gè)數(shù)組的新數(shù)組。如上面的array8形狀是(2, 3), array10的形狀是(2, 2, 3),從末尾依次比較,3等于3,2等于2,最前面有一個(gè)值為空,滿足廣播的機(jī)制,相乘后得到一個(gè)形狀為(2, 2, 3)的新數(shù)組。下面看一個(gè)不能廣播的例子。array11 = np.array([[1, 1, 1, 1], [1, 1, 1, 1]])print(array8 * array11)
ValueError: operands could not be broadcast together with shapes (2,3) (2,4)
上面的array8形狀是(2, 3), array11的形狀是(2, 4),從末尾開始比較,一個(gè)為3,一個(gè)為4,不滿足廣播的三種條件,所以不能廣播,執(zhí)行運(yùn)算會(huì)報(bào)錯(cuò)。array12 = np.array([[1, 10]])array13 = np.array([[1, 2, 3], [4, 5, 6]])print(array12.shape, array13.shape)print(np.mat(array12) * np.mat(array13))print(np.matmul(array12, array13))print(np.dot(array12, array13))
(1, 2) (2, 3)[[41 52 63]][[41 52 63]][[41 52 63]]
與ndarray相比,矩陣一定是二維的。矩陣相乘的條件是第一個(gè)矩陣的列與第二個(gè)矩陣的行相等,(M行 * N列) * (N行 * L列) = (M行 * L列)。
mat(): 將二維的數(shù)組轉(zhuǎn)換成矩陣。將兩個(gè)數(shù)組轉(zhuǎn)換成矩陣后,如果滿足矩陣的相乘條件,即可將它們相乘。
matmul(x1, x2): 矩陣相乘,傳入兩個(gè)滿足相乘條件的矩陣,也可以是二維數(shù)組或列表,會(huì)自動(dòng)轉(zhuǎn)換成矩陣。
dot(a, b[, out]): 矩陣相乘,傳入兩個(gè)滿足相乘條件的矩陣,也可以是二維數(shù)組或列表,會(huì)自動(dòng)轉(zhuǎn)換成矩陣。
array14 = np.array([[1, 2, 3], [4, 5, 6]])array15 = np.array([[1, 1, 1], [2, 2, 2]])print(np.concatenate([array14, array15], axis=1))print(np.concatenate([array14, array15], axis=0))print(np.hstack([array14, array15]))print(np.vstack([array14, array15]))
[[1 2 3 1 1 1] [4 5 6 2 2 2]][[1 2 3] [4 5 6] [1 1 1] [2 2 2]][[1 2 3 1 1 1] [4 5 6 2 2 2]][[1 2 3] [4 5 6] [1 1 1] [2 2 2]]
concatenate(arrays[, axis, out]): 合并兩個(gè)數(shù)組,將需要合并的數(shù)組放到一個(gè)可迭代對(duì)象(列表或元組)中。axis為1表示水平合并,axis為0表示垂直合并,默認(rèn)為0。
hstack(tup): 水平合并兩個(gè)數(shù)組,h是horizontally的縮寫。
vstack(tup): 垂直合并兩個(gè)數(shù)組,v是vertically的縮寫。
array16 = np.array([1, 2, 3, 4, 5, 6])print(np.split(array16, 2))print(np.split(array16, [2, 3, 5]))
[array([1, 2, 3]), array([4, 5, 6])][array([1, 2]), array([3]), array([4, 5]), array([6])]
split(ary[, indices_or_sections, axis]): 分割數(shù)組。split函數(shù)會(huì)把數(shù)組當(dāng)成一維數(shù)組來(lái)分割,即使傳入的是多維數(shù)組。第二個(gè)參數(shù)如果傳入一個(gè)整數(shù),則會(huì)進(jìn)行等分,無(wú)法等分時(shí)報(bào)錯(cuò)。第二個(gè)參數(shù)如果傳入由指定分割點(diǎn)組成的可迭代對(duì)象,則按指定的分割點(diǎn)進(jìn)行分割,分割點(diǎn)如果超出被分割數(shù)組的數(shù)據(jù)范圍,超出部分返回空數(shù)組。
十、ndarray讀寫文件
提前準(zhǔn)備一個(gè)叫array.csv的文件,數(shù)據(jù)如下。data1,data2,data3,data41,2,3,45,6,,78,,9,10
array17 = np.genfromtxt('array.csv', delimiter=',', skip_header=1)print(array17)np.savetxt('save.csv', array17, fmt='%.0f', delimiter=',')
[[ 1. 2. 3. 4.] [ 5. 6. nan 7.] [ 8. nan 9. 10.]]
genfromtxt(fname[, delimiter, skip_header, skip_footer, ...]): 從txt文件或csv文件中讀取數(shù)據(jù),生成一個(gè)數(shù)組。fname為必傳參數(shù),表示讀取的文件名,要根據(jù)情況帶上相對(duì)路徑。delimiter表示讀取數(shù)據(jù)時(shí)的分割點(diǎn),默認(rèn)為None,csv文件通常是以逗號(hào)分割的,txt文件則可能以空格或逗號(hào)分割。skip_header表示跳過(guò)數(shù)據(jù)的前幾行,默認(rèn)為0,通常用來(lái)跳過(guò)表頭。這個(gè)函數(shù)的參數(shù)特別多,其他的根據(jù)需要點(diǎn)進(jìn)源碼查看即可。
讀取的數(shù)據(jù)中很可能有缺失值,也就是空值,讀取后,ndarray中將空值顯示為nan。在數(shù)據(jù)分析過(guò)程中,要對(duì)缺失值做處理,一般情況,如果缺失值不多,可以直接刪除有缺失的行,也可以用缺失值所在列的平均值進(jìn)行填充。根據(jù)業(yè)務(wù)的不同,還有其他合理的填充方式,本文就不展開了。
savetxt(fname, X[, fmt, delimiter]): 將數(shù)據(jù)保存到txt文件中。fname參數(shù)表示保存的文件名。X傳入一維或二維的形似array的數(shù)據(jù),表示要保存到文件中的數(shù)據(jù)。delimiter參數(shù)同genfromtxt(),還有幾個(gè)參數(shù)按需查看。將上面讀出來(lái)的數(shù)據(jù)保存到新文件save.csv中,結(jié)果如下。1,2,3,45,6,nan,78,nan,9,10
總結(jié)
numpy庫(kù)主要用于處理ndarray,也就是多維數(shù)組。
實(shí)際應(yīng)用中需要的各種功能基本上都有,使用時(shí)只需要調(diào)對(duì)應(yīng)的函數(shù)或方法就行了,非常方便。
加微信送《Python知識(shí)點(diǎn)100題PDF》
添加pk哥個(gè)人微信即送Python資料
→ Python知識(shí)點(diǎn)100題的PDF
→ Python相關(guān)的電子書10本
↓點(diǎn)擊閱讀原文查看pk哥原創(chuàng)視頻