總結numpy中的ndarray,非常齊全
numpy(Numerical Python)是一個開源的Python資料科學計算庫,支援對N維數組和矩陣的操作,用于快速處理任意次元的數組。
numpy庫的功能非常聚焦,專注于做好“一件事”。numpy主要使用ndarray來處理N維數組,numpy中的大部分屬性和方法都是為ndarray服務的。是以,掌握了ndarray的用法,基本就掌握了numpy的用法。
ndarray是一個N維數組類型的對象,與python的基本資料類型清單相比,同一個ndarray中所有元素的資料類型都相同,而清單中可以存儲不同類型的資料。ndarray在存儲的資料類型上做限制,換取了運算效率的提升和資料處理的便捷,在資料分析中非常實用。
一、ndarray的屬性
# coding=utf-8
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的元素數量: ', array_a.size)
print('ndarray中的資料類型: ', array_a.dtype)
print(type(array_a))
[[1 2 3]
[4 5 6]]
ndarray的次元: 2
ndarray的形狀: (2, 3)
ndarray的元素數量: 6
ndarray中的資料類型: int32
<class 'numpy.ndarray'>
ndarray有很多屬性和方法,可以用dir()内置方法将他們列印出來。本文先從屬性開始介紹。
shape屬性表示ndarray的形狀,是一個元組,表示數組有幾維,每個次元有多少個資料。ndim屬性表示數組的次元。size屬性表示數組中的元素個數,size可以通過shape中的值相乘得到。dtype屬性表示數組中儲存的資料類型。從Python解釋器的角度看,ndarray屬于numpy.ndarray對象。
二、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是一個一維數組,數組中有三個資料。array_c是一個二維數組,數組中有2*3個資料。array_d是一個三維數組,數組中有2*2*3個資料。是以它們的形狀分别是(3,) 、(2, 3)和 (2, 2, 3)。用圖形表示如下:
從一維到三維的變化,可以幫助我們了解ndarray的次元和形狀變化。ndarray的次元可以是N維,從4維開始,不友善用圖形來展示,會稍微抽象一點。
從Python中的資料表示方式來看,N維數組的顯示結果與清單相同,每多嵌套一層,就代表多一個次元。根據上面例子中的資料,依次類推,可以表示出更多元度的ndarray資料。
三、ndarray中的資料類型
前面已經提到,在一個ndarray對象中,存儲的是同一類型的資料,ndarray中常見的資料類型有下表這些。
名稱 | 描述 | 簡寫 |
np.bool | 用一個位元組存儲的布爾類型(True或False),在資料分析中很常用。 | 'b' |
np.int8 | 一個位元組大小,-128至127,不常用。 | 'i' |
np.int16 | 整數,-32768至32767,不常用。 | 'i2' |
np.int32 | 整數,-2^31至2^32-1,常用。 | 'i4' |
np.int64 | 整數,-2^63至2^63-1,常用,一般整數預設為np.int64或np.int32。 | 'i8' |
np.uint8 | 無符号整數,0至255,不常用。 | 'u' |
np.uint16 | 無符号整數,0至65535,不常用。 | 'u2' |
np.uint32 | 無符号整數,0至2^32-1,常用。 | 'u4' |
np.uint64 | 無符号整數,0至2^64-1,常用。 | 'u8' |
np.float16 | 16位半精度浮點數,正負号1位,指數5位,精度10位,不常用。 | 'f2' |
np.float32 | 32位單精度浮點數,正負号1位,指數8位,精度23位,不常用。 | 'f4' |
np.float64 | 64位雙精度浮點數,正負号1位,指數11位,精度52位,常用。 | 'f8' |
np.complex64 | 複數,分别用兩個32位浮點數表示實部和虛部,基本不會用。 | 'c8' |
np.complex128 | 複數,分别用兩個64位浮點數表示實部和虛部,基本不會用。 | 'c16' |
np.object_ | python對象,常用。 | 'O' |
np.string_ | 字元串,常用。 | 'S' |
np.unicode_ | unicode類型,不常用。 | 'U' |
四、修改ndarray的形狀和資料類型
1. 修改ndarray的形狀
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.T
print(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的形狀。修改數組的形狀時,不能改變數組中的元素個數,如上面的數組形狀是(2, 3),可以修改成(3, 2)或(1, 6)、(6, 1),修改形狀後仍然是6個元素。
ndarray.T: 将ndarray轉置(行和列交換,行變成列,列變成行)。 對比上面的兩次修改,reshape()和.T轉換後數組的形狀都是(3, 2),但資料的排列方式不一樣,reshape()修改的結果沒有改變資料的先後順序,.T的結果是将行變成列,列變成行。
2. 修改ndarray的資料類型
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中的資料類型。傳入需要修改的資料類型,其他關鍵字參數可以不關注。
五、ndarray的多種生成和建立方法
1. 生成全為0或全為1的ndarray
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為必傳參數,表示生成的數組的形狀。dtype表示數組中存儲的資料類型,預設為float64,可以指定資料類型。order表示數組的秩序,表示存儲的資料是以行為主還是以列為主(兩種風格),通常不關注此參數。
zeros(shape[, dtype, order]): 生成全為0的ndarray。參數同ones()。
ones_like(a[, dtype, order, subok]): 生成全為1的ndarray,形狀與已知數組相同。a為必傳參數,傳入一個形似array的資料(array_like,通常是嵌套清單或數組)。dtype表示數組中存儲的資料類型,預設與傳入的數組相同。另外兩個參數通常不關注。
zeros_like(a[, dtype, order, subok]): 生成全為0的ndarray,形狀與已知數組相同。參數同ones_like()。
2. 生成全為指定值或全為空的ndarray
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為必傳參數,表示生成的數組的形狀。fill_value為必傳參數,表示指定的填充值。
full_like(a, fill_value[, dtype, order, subok]): 生成全為指定值的ndarray,形狀與已知數組相同。a為必傳參數,傳入一個形似array的資料。fill_value為必傳參數,表示指定的填充值。
empty(shape[, dtype, order]): 生成全為空值的ndarray。如果記憶體空間中存在一個數組,與生成的空數組形狀和資料類型都相同,則生成的空數組會直接指向存在的數組。如果要生成一個完全為空的數組,需要先将記憶體中形狀和資料類型都相同的數組清除,或使空數組的形狀或資料類型與已存在的數組不同,這樣才能新開辟記憶體空間,生成真正的空數組,列印空數組的結果是記憶體編碼。與前面的函數相似,也有對應的empty_like(a[, dtype, order, subok])函數。
3. 生成指定範圍值的ndarray
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]): 給定起始值、結束值(不包含結束值)和步長,生成指定範圍的一維數組,效果相當于Python内置函數range()。
linspace(start, stop[, num, endpoint, retstep, dtype, axis]): 給定起始值、結束值,生成等間隔的一維數組。start表示數組的起始值。stop表示數組的終止值。num表示生成數組中的資料個數,預設為50。endpoint表示數組中是否包含stop值,預設為Ture。retstep表示是否傳回數組的步長,預設為False。dtype表示ndarray中的資料類型。
linspace()中的start或stop也可以傳入形似array的資料,此時可生成二維數組。axis參數此時可以派上用場,表示将array_like的資料作為行還是作為列來生成二維數組,預設為0時作為行,如果為-1則作為列。
logspace(start, stop[, num, endpoint, base, dtype, axis]): 給定起始值、結束值,生成等間隔的一維數組,資料為對數函數log的值。base表示log函數的底數,預設為10。其他參數同linspace()。
4. 生成随機值的ndarray
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): 給定起始值、結束值(不包含結束值)和資料個數,從指定範圍内生成指定個數(每次生成一個,共size次)的整數,組成一個一維數組。
np.random.rand(): 生成一個0到1(不包含1)之間的随機數,如果傳入生成的資料個數,則生成一維數組,數組中的每個值都是0到1之間的随機數。
np.random.uniform(low=0.0, high=1.0, size=None): 給定起始值、結束值(不包含結束值)和資料個數,從指定範圍内生成指定個數的小數,組成一維數組。預設同rand()。
這三個函數在生成随機數組時,資料範圍内的每個數機率相等,資料是均勻分布的。
np.random.randn(): 按标準正太分布(均值為0,标準差為1)生成一個随機數。如果傳入生成的資料個數,則生成一維數組。
np.random.normal(loc=0.0, scale=1.0, size=None): 給定均值、标準差和資料個數,按正太分布的機率生成指定個數的數,組成一個一維數組。
randn()和normal()函數生成的随機數組中,資料是正太分布的。
5. ndarray的淺拷貝和深拷貝
除了直接建立新的數組,也可以複制已有的數組。
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]): 建立一個數組,傳入一個形似array的資料。在最開始介紹ndarray屬性時,就是用array()建立數組。
asarray(a[, dtype, order]): 将輸入的資料轉換為一個數組,輸入一個嵌套清單或數組,可以用此函數來實作拷貝數組。asarray()還有幾個延伸的函數asanyarray(a[, dtype, order]),ascontiguousarray(a[, dtype])和asmatrix(data[, dtype])。
copy(a[, order]): 拷貝數組。copy()函數是深拷貝,asarray()函數是淺拷貝,下面驗證一下。
array_x[0][1] = 6
print(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]]
被拷貝的數組中所有資料都是5,用asarray()和copy()函數拷貝的數組也一樣。修改被拷貝數組中第一維第二個資料為6後,asarray()函數拷貝的數組中也變成了6,copy()函數拷貝的數組中還是5,說明asarray()函數是淺拷貝,copy()函數是深拷貝。
六、ndarray的索引、切片和去重
1. ndarray的索引和切片
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清單的方式相同,可以直接用清單的文法對ndarray進行索引和切片操作。另外,numpy中還有特殊的索引和切片文法,如array[1, 0]與array[1][0]的結果一樣。
2. ndarray的去重
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]): 對ndarray去重。預設是對整個數組去重,傳回一個一維數組。也可以使用axis參數指定按行還是按列去重。
七、ndarray的運算
1. 邏輯運算
array3 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.all(array3 > 1))
print(np.any(array3 > 1))
False
True
ndarray可以直接與整數進行比較,判斷大小,傳回布爾值。
all(a[, axis, out, keepdims]): 當ndarray中的所有元素都滿足邏輯判斷時,傳回真,否則傳回假。如數組[[1, 2, 3], [4, 5, 6]] > 1當且僅當所有數都大于1時,才為真。
any(a[, axis, out, keepdims]): 隻要ndarray中有一個元素滿足邏輯判斷,傳回真,全都不滿足時傳回假。如數組[[1, 2, 3], [4, 5, 6]] > 1隻要有一個數大于1,就為真。
2. 三目運算
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): 對ndarray中的所有資料進行邏輯運算,邏輯為真的位置指派為x,邏輯為假的位置指派為y,實作三目運算。如果需要進行複合邏輯運算,可以使用np.logical_and()、np.logical_not()、np.logical_or()或np.logical_xor()來連接配接,分别表示邏輯與、邏輯非、邏輯或和邏輯異或(同真同假為假,一真一假為真)。
3. 統計運算
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('中位數: ', np.median(array7))
print('平均值: ', np.mean(array7))
print('标準差: ', np.std(array7))
print('方差: ', np.var(array7))
print('最小值的索引: ', np.argmin(array7))
print('最大值的索引: ', np.argmax(array7))
最小值: 1 [1 3 5]
最大值: 11 [ 5 11]
中位數: 6.0
平均值: 6.0
标準差: 3.415650255319866
方差: 11.666666666666666
最小值的索引: 0
最大值的索引: 5
min(a[, axis, out, keepdims, initial, where]): 傳回ndarray中的最小值。實際調用的是amin()函數。如果設定axis為0,則計算每一列的最小值,axis為1,則計算每一行的最小值。
max(a[, axis, out, keepdims, initial, where]): 傳回ndarray中的最大值。實際調用的是amax()函數。
median(a[, axis, out, overwrite_input, keepdims]): 傳回ndarray中的中位數。
mean(a[, axis, dtype, out, keepdims]): 傳回ndarray的平均值。
std(a[, axis, dtype, out, ddof, keepdims]): 傳回ndarray的标準差。
var(a[, axis, dtype, out, ddof, keepdims]): 傳回ndarray的方差。
argmin(a[, axis, out]): 傳回ndarray中最小值的索引。
argmax(a[, axis, out]): 傳回ndarray中最大值的索引。
上面的所有函數中,axis參數的用法都相同。
八、ndarray之間的運算
1. ndarray與數字和ndarray之間的運算
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可以直接與數字進行算術運算,注意乘法運算與清單的乘法運算不同,清單與數字相乘是拼接,而ndarray與數字相乘是數組中的每一個資料與數字相乘生成一個新數組。
兩個形狀相同的數組之間也可以直接進行算術運算,運算的結果是将兩個數組索引相同的資料進行算術運作,生成一個新數組。
2. ndarray的廣播機制
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]]]
當兩個數組的形狀不相同時,要将他們進行運算,numpy會嘗試進行廣播。廣播是将兩個數組的形狀元組值從後往前逐個進行比較,如果元組中的值相等、其中一個為1或其中一個不存在,則兩個數組可以進行運算,生成一個相容兩個數組的新數組。如上面的array8形狀是(2, 3), array10的形狀是(2, 2, 3),從末尾依次比較,3等于3,2等于2,最前面有一個值為空,滿足廣播的機制,相乘後得到一個形狀為(2, 2, 3)的新數組。下面看一個不能廣播的例子。
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),從末尾開始比較,一個為3,一個為4,不滿足廣播的三種條件,是以不能廣播,執行運算會報錯。
3. 矩陣相乘
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相比,矩陣一定是二維的。矩陣相乘的條件是第一個矩陣的列與第二個矩陣的行相等,(M行 * N列) * (N行 * L列) = (M行 * L列)。
mat(): 将二維的數組轉換成矩陣。将兩個數組轉換成矩陣後,如果滿足矩陣的相乘條件,即可将它們相乘。
matmul(x1, x2): 矩陣相乘,傳入兩個滿足相乘條件的矩陣,也可以是二維數組或清單,會自動轉換成矩陣。
dot(a, b[, out]): 矩陣相乘,傳入兩個滿足相乘條件的矩陣,也可以是二維數組或清單,會自動轉換成矩陣。
九、ndarray的合并和分割
1. ndarray的合并
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]): 合并兩個數組,将需要合并的數組放到一個可疊代對象(清單或元組)中。axis為1表示水準合并,axis為0表示垂直合并,預設為0。
hstack(tup): 水準合并兩個數組,h是horizontally的縮寫。
vstack(tup): 垂直合并兩個數組,v是vertically的縮寫。
2. ndarray的分割
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]): 分割數組。split函數會把數組當成一維數組來分割,即使傳入的是多元數組。第二個參數如果傳入一個整數,則會進行等分,無法等分時報錯。第二個參數如果傳入由指定分割點組成的可疊代對象,則按指定的分割點進行分割,分割點如果超出被分割數組的資料範圍,超出部分傳回空數組。
十、ndarray讀寫檔案
提前準備一個叫array.csv的檔案,資料如下。
data1,data2,data3,data4
1,2,3,4
5,6,,7
8,,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檔案中讀取資料,生成一個數組。fname為必傳參數,表示讀取的檔案名,要根據情況帶上相對路徑。delimiter表示讀取資料時的分割點,預設為None,csv檔案通常是以逗号分割的,txt檔案則可能以空格或逗号分割。skip_header表示跳過資料的前幾行,預設為0,通常用來跳過表頭。這個函數的參數特别多,其他的根據需要點進源碼檢視即可。
讀取的資料中很可能有缺失值,也就是空值,讀取後,ndarray中将空值顯示為nan。在資料分析過程中,要對缺失值做處理,一般情況,如果缺失值不多,可以直接删除有缺失的行,也可以用缺失值所在列的平均值進行填充。根據業務的不同,還有其他合理的填充方式,本文就不展開了。
savetxt(fname, X[, fmt, delimiter]): 将資料儲存到txt檔案中。fname參數表示儲存的檔案名。X傳入一維或二維的形似array的資料,表示要儲存到檔案中的資料。delimiter參數同genfromtxt(),還有幾個參數按需檢視。将上面讀出來的資料儲存到新檔案save.csv中,結果如下。
1,2,3,4
5,6,nan,7
8,nan,9,10
十一、總結
numpy庫主要用于處理ndarray,也就是多元數組。
實際應用中需要的各種功能基本上都有,使用時隻需要調對應的函數或方法就行了,非常友善。