数据分析之numpy
一、NumPy Ndarray 對象
NumPy 最重要的一個特點是其 N 維數組對象 ndarray,它是一系列同類型數據的集合,以 0 下標為開始進行集合中元素的索引。
ndarray 對象是用于存放同類型元素的多維數組。
ndarray 中的每個元素在內存中都有相同存儲大小的區域。
ndarray 內部由以下內容組成:
-
一個指向數據(內存或內存映射文件中的一塊數據)的指針。
-
數據類型或 dtype,描述在數組中的固定大小值的格子。
-
一個表示數組形狀(shape)的元組,表示各維度大小的元組。
-
一個跨度元組(stride),其中的整數指的是為了前進到當前維度下一個元素需要"跨過"的字節數。
二、Numpy數據類型
numpy 支持的數據類型比 Python 內置的類型要多很多,基本上可以和 C 語言的數據類型對應上,其中部分類型對應為 Python 內置的類型。
bool_ 布爾型數據類型(True 或者 False) int_ 默認的整數類型(類似于 C 語言中的 long,int32 或 int64) intc 與 C 的 int 類型一樣,一般是 int32 或 int 64 intp 用于索引的整數類型(類似于 C 的 ssize_t,一般情況下仍然是 int32 或 int64) int8 字節(-128 to 127) int16 整數(-32768 to 32767) int32 整數(-2147483648 to 2147483647) int64 整數(-9223372036854775808 to 9223372036854775807) uint8 無符號整數(0 to 255) uint16 無符號整數(0 to 65535) uint32 無符號整數(0 to 4294967295) uint64 無符號整數(0 to 18446744073709551615) float_ float64 類型的簡寫 float16 半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位 float32 單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位 float64 雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位 complex_ complex128 類型的簡寫,即 128 位復數 complex64 復數,表示雙 32 位浮點數(實數部分和虛數部分) complex128 復數,表示雙 64 位浮點數(實數部分和虛數部分) View Code三、Numpy數組屬性
NumPy 數組的維數稱為秩(rank),一維數組的秩為 1,二維數組的秩為 2,以此類推。
在 NumPy中,每一個線性的數組稱為是一個軸(axis),也就是維度(dimensions)。比如說,二維數組相當于是兩個一維數組,其中第一個一維數組中每個元素又是一個一維數組。所以一維數組就是 NumPy 中的軸(axis),第一個軸相當于是底層數組,第二個軸是底層數組里的數組。而軸的數量——秩,就是數組的維數。
ndarray.ndim 秩,即軸的數量或維度的數量 ndarray.shape 數組的維度,對于矩陣,n 行 m 列 ndarray.size 數組元素的總個數,相當于 .shape 中 n*m 的值 ndarray.dtype ndarray 對象的元素類型 ndarray.itemsize ndarray 對象中每個元素的大小,以字節為單位 ndarray.flags ndarray 對象的內存信息 ndarray.real ndarray元素的實部 ndarray.imag ndarray 元素的虛部 ndarray.data 包含實際數組元素的緩沖區,由于一般通過數組的索引獲取元素,所以通常不需要使用這個屬性。 View Code四、數組的創建
numpy.empty(shape, dtype = float, order = 'C') shape 數組形狀 dtype 數據類型,可選 order 有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機內存中的存儲元素的順序。 numpy.empty numpy.zeros(shape, dtype = float, order = 'C') shape 數組形狀 dtype 數據類型,可選 order 'C' 用于 C 的行數組,或者 'F' 用于 FORTRAN 的列數組 numpy.zeros numpy.ones(shape, dtype = None, order = 'C') shape 數組形狀 dtype 數據類型,可選 order 'C' 用于 C 的行數組,或者 'F' 用于 FORTRAN 的列數組 numpy.ones從已有的數組創建數組:
numpy.asarray(a, dtype = None, order = None) a 任意形式的輸入參數,可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維數組 dtype 數據類型,可選 order 可選,有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機內存中的存儲元素的順序。 numpy.asarray numpy.frombuffer 用于實現動態數組。 numpy.frombuffer 接受 buffer 輸入參數,以流的形式讀入轉化成 ndarray 對象。numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0) buffer 可以是任意對象,會以流的形式讀入。 dtype 返回數組的數據類型,可選 count 讀取的數據數量,默認為-1,讀取所有數據。 offset 讀取的起始位置,默認為0。 numpy.frombuffer numpy.fromiter(iterable, dtype, count=-1) iterable 可迭代對象 dtype 返回數組的數據類型 count 讀取的數據數量,默認為-1,讀取所有數據 numpy.fromiter從數值范圍創建數組:
創建數值范圍并返回 ndarray 對象numpy.arange(start, stop, step, dtype) start 起始值,默認為0 stop 終止值(不包含) step 步長,默認為1 dtype 返回ndarray的數據類型,如果沒有提供,則會使用輸入數據的類型。 numpy.arange 創建一個一維數組,數組是一個等差數列構成的 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) start 序列的起始值 stop 序列的終止值,如果endpoint為true,該值包含于數列中 num 要生成的等步長的樣本數量,默認為50 endpoint 該值為 ture 時,數列中中包含stop值,反之不包含,默認是True。 retstep 如果為 True 時,生成的數組中會顯示間距,反之不顯示。 dtype ndarray 的數據類型 numpy.linspace 用于創建一個于等比數列np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) start 序列的起始值為:base ** start stop 序列的終止值為:base ** stop。如果endpoint為true,該值包含于數列中 num 要生成的等步長的樣本數量,默認為50 endpoint 該值為 ture 時,數列中中包含stop值,反之不包含,默認是True。 base 對數 log 的底數。 dtype ndarray 的數據類型 numpy.logspace五、Numpy數組的切片與索引
ndarray對象的內容可以通過索引或切片來訪問和修改,與 list 的切片操作一樣。
高級索引:
import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print (y)[1 4 5] 整數數組索引 布爾索引通過布爾運算(如:比較運算符)來獲取符合指定條件的元素的數組。import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('我們的數組是:') print (x) print ('\n') # 現在我們會打印出大于 5 的元素 print ('大于 5 的元素是:') print (x[x > 5])我們的數組是: [[ 0 1 2][ 3 4 5][ 6 7 8][ 9 10 11]]大于 5 的元素是: [ 6 7 8 9 10 11] 布爾索引 花式索引指的是利用整數數組進行索引。 花式索引根據索引數組的值作為目標數組的某個軸的下標來取值。對于使用一維整型數組作為索引,如果目標是一維數組,那么索引的結果就是對應位置的元素;如果目標是二維數組,那么就是對應下標的行。import numpy as np x=np.arange(32).reshape((8,4)) print (x[[4,2,1,7]])[[16 17 18 19][ 8 9 10 11][ 4 5 6 7][28 29 30 31]] 花式索引六、NumPy 廣播
廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。
廣播的規則:
- 讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊。
- 輸出數組的形狀是輸入數組形狀的各個維度上的最大值。
- 如果輸入數組的某個維度和輸出數組的對應維度的長度相同或者其長度為 1 時,這個數組能夠用來計算,否則出錯。
- 當輸入數組的某個維度的長度為 1 時,沿著此維度運算時都用此維度上的第一組值。
簡單理解:對兩個數組,分別比較他們的每一個維度(若其中一個數組沒有當前維度則忽略),滿足:
- 數組擁有相同形狀。
- 當前維度的值相等。
- 當前維度的值有一個是 1。
若條件不滿足,拋出?"ValueError: frames are not aligned"?異常。
七、NumPy 迭代數組
np.nditer(ndarray,order, op_flags, flags) 將ndarray對象轉換為迭代器
c_index 可以跟蹤 C 順序的索引 f_index 可以跟蹤 Fortran 順序的索引 multi-index 每次迭代可以跟蹤一種索引類型 external_loop 給出的值是具有多個值的一維數組,而不是零維數組 flags廣播迭代,如果兩個數組是可廣播的,nditer 組合對象能夠同時迭代它們。
八、Numpy數組操作
numpy.reshape(arr, newshape, order='C') arr:要修改形狀的數組 newshape:整數或者整數數組,新的形狀應當兼容原有形狀 order:'C' -- 按行,'F' -- 按列,'A' -- 原順序,'k' -- 元素在內存中的出現順序。numpy.ndarray.flat 一個數組元素迭代器numpy.ndarray.flatten 返回一份數組拷貝,對拷貝所做的修改不會影響原始數組numpy.ravel 展平的數組元素,順序通常是"C風格",返回的是數組視圖(view,有點類似 C/C++引用reference的意味),修改會影響原始數組。 修改數組形狀 用于對換數組的維度 numpy.transpose(arr, axes) arr:要操作的數組 axes:整數列表,對應維度,通常所有維度都會對換。向后滾動特定的軸到一個特定位置 numpy.rollaxis(arr, axis, start) arr:數組 axis:要向后滾動的軸,其它軸的相對位置不會改變 start:默認為零,表示完整的滾動。會滾動到特定位置。 用于交換數組的兩個軸 numpy.swapaxes(arr, axis1, axis2) arr:輸入的數組 axis1:對應第一個軸的整數 axis2:對應第二個軸的整數 翻轉數組 numpy.broadcast 模仿廣播的對象,它返回一個對象,該對象封裝了將一個數組廣播到另一個數組的結果。numpy.broadcast_to numpy.broadcast_to 函數將數組廣播到新形狀。它在原始數組上返回只讀視圖。 它通常不連續。 如果新形狀不符合 NumPy 的廣播規則,該函數可能會拋出ValueError。numpy.expand_dims 通過在指定位置插入新的軸來擴展數組形狀numpy.squeeze 從給定數組的形狀中刪除一維的條目 修改數組維度 用于沿指定軸連接相同形狀的兩個或多個數組 numpy.concatenate((a1, a2, ...), axis) a1, a2, ...:相同類型的數組 axis:沿著它連接數組的軸,默認為 0用于沿新軸連接數組序列 numpy.stack(arrays, axis) arrays相同形狀的數組序列 axis:返回數組中的軸,輸入數組沿著它來堆疊numpy.hstack numpy.stack 函數的變體,它通過水平堆疊來生成數組。 numpy.vstack numpy.stack 函數的變體,它通過垂直堆疊來生成數組。 連接數組 沿特定的軸將數組分割為子數組 numpy.split(ary, indices_or_sections, axis) ary:被分割的數組 indices_or_sections:果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉) axis:沿著哪個維度進行切向,默認為0,橫向切分。為1時,縱向切分numpy.hsplit 用于水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組。 numpy.vsplit 沿著垂直軸分割,其分割方式與hsplit用法相同。 分割數組 返回指定大小的新數組。 numpy.resize(arr, shape) arr:要修改大小的數組 shape:返回數組的新形狀函數在數組的末尾添加值。 追加操作會分配整個數組,并把原來的數組復制到新數組中。 此外,輸入數組的維度必須匹配否則將生成ValueError。 numpy.append(arr, values, axis=None) arr:輸入數組 values:要向arr添加的值,需要和arr形狀相同(除了要添加的軸) axis:默認為 None。當axis無定義時,是橫向加成,返回總是為一維數組!當axis有定義的時候,分別為0和1的時候。當axis有定義的時候,分別為0和1的時候(列數要相同)。當axis為1時,數組是加在右邊(行數要相同)。給定索引之前,沿給定軸在輸入數組中插入值。 numpy.insert(arr, obj, values, axis) arr:輸入數組 obj:在其之前插入值的索引 values:要插入的值 axis:沿著它插入的軸,如果未提供,則輸入數組會被展開返回從輸入數組中刪除指定子數組的新數組。 Numpy.delete(arr, obj, axis) arr:輸入數組 obj:可以被切片,整數或者整數數組,表明要從輸入數組刪除的子數組 axis:沿著它刪除給定子數組的軸,如果未提供,則輸入數組會被展開用于去除數組中的重復元素 numpy.unique(arr, return_index, return_inverse, return_counts) arr:輸入數組,如果不是一維數組則會展開 return_index:如果為true,返回新列表元素在舊列表中的位置(下標),并以列表形式儲 return_inverse:如果為true,返回舊列表元素在新列表中的位置(下標),并以列表形式儲 return_counts:如果為true,返回去重數組中的元素在原數組中的出現次數 數組元素的添加與刪除九、Numpy位運算
bitwise_and 對數組元素執行位與操作 bitwise_or 對數組元素執行位或操作 invert 按位取反 left_shift 向左移動二進制表示的位 right_shift 向右移動二進制表示的位十、Numpy字符串處理
與python str類型類似
add() 對兩個數組的逐個字符串元素進行連接 multiply() 返回按元素多重連接后的字符串 center() 居中字符串 capitalize() 將字符串第一個字母轉換為大寫 title() 將字符串的每個單詞的第一個字母轉換為大寫 lower() 數組元素轉換為小寫 upper() 數組元素轉換為大寫 split() 指定分隔符對字符串進行分割,并返回數組列表 splitlines() 返回元素中的行列表,以換行符分割 strip() 移除元素開頭或者結尾處的特定字符 join() 通過指定分隔符來連接數組中的元素 replace() 使用新字符串替換字符串中的所有子字符串 decode() 數組元素依次調用str.decode encode() 數組元素依次調用str.encode十一、Numpy計算類函數
數學函數:
NumPy 提供了標準的三角函數:sin()、cos()、tan()。
可以通過 numpy.degrees() 函數將弧度轉換為角度。
numpy.around() 函數返回指定數字的四舍五入值。
numpy.floor() 返回數字的下舍整數。
numpy.ceil() 返回數字的上入整數。
算數函數:
NumPy 算術函數包含簡單的加減乘除:?add(),subtract(),multiply()?和?divide()。
numpy.reciprocal() 函數返回參數逐元素的倒數。
numpy.power() 函數將第一個輸入數組中的元素作為底數,計算它與第二個輸入數組中相應元素的冪。
numpy.mod() 計算輸入數組中相應元素的相除后的余數。 函數 numpy.remainder() 也產生相同的結果。
統計函數:
numpy.amin() 用于計算數組中的元素沿指定軸的最小值。
numpy.amax() 用于計算數組中的元素沿指定軸的最大值。
numpy.ptp() 函數計算數組中元素最大值與最小值的差(最大值 - 最小值)。
numpy.percentile() 百分位數是統計中使用的度量,表示小于這個值的觀察值的百分比。
numpy.percentile(a, q, axis) a: 輸入數組 q: 要計算的百分位數,在 0 ~ 100 之間 axis: 沿著它計算百分位數的軸 第 p 個百分位數是這樣一個值,它使得至少有 p% 的數據項小于或等于這個值,且至少有 (100-p)% 的數據項大于或等于這個值。import numpy as np a = np.array([[10, 7, 4], [3, 2, 1]]) print ('我們的數組是:') print (a)print ('調用 percentile() 函數:') # 50% 的分位數,就是 a 里排序之后的中位數 print (np.percentile(a, 50)) # axis 為 0,在縱列上求 print (np.percentile(a, 50, axis=0)) # axis 為 1,在橫行上求 print (np.percentile(a, 50, axis=1)) # 保持維度不變 print (np.percentile(a, 50, axis=1, keepdims=True))我們的數組是: [[10 7 4][ 3 2 1]] 調用 percentile() 函數: 3.5 [6.5 4.5 2.5] [7. 2.] [[7.][2.]] numpy.percentile()numpy.median() 函數用于計算數組 a 中元素的中位數(中值)
numpy.mean() 函數返回數組中元素的算術平均值。
numpy.average() 函數根據在另一個數組中給出的各自的權重計算數組中元素的加權平均值。
np.std() 標準差是一組數據平均值分散程度的一種度量。
np.var() 方差
十二、Numpy排序與條件篩選
numpy.sort(a, axis, kind, order) a: 要排序的數組 axis: 沿著它排序數組的軸,如果沒有數組會被展開,沿著最后的軸排序, axis=0 按列排序,axis=1 按行排序 kind: 默認為'quicksort'(快速排序) order: 如果數組包含字段,則是要排序的字段numpy.argsort() 函數返回的是數組值從小到大的索引值。numpy.lexsort() 用于對多個序列進行排序。把它想象成對電子表格進行排序,每一列代表一個序列,排序時優先照顧靠后的列。msort(a) 數組按第一個軸排序,返回排序后的數組副本。np.msort(a) 相等于 np.sort(a, axis=0)。 sort_complex(a) 對復數按照先實部后虛部的順序進行排序。 partition(a, kth[, axis, kind, order]) 指定一個數,對數組進行分區 argpartition(a, kth[, axis, kind, order]) 可以通過關鍵字 kind 指定算法沿著指定軸對數組進行分區numpy.argmax() 和 numpy.argmin()函數分別沿給定軸返回最大和最小元素的索引。numpy.nonzero() 函數返回輸入數組中非零元素的索引。numpy.where() 函數返回輸入數組中滿足給定條件的元素的索引。numpy.extract() 函數根據某個條件從數組中抽取元素,返回滿條件的元素。十三、Numpy字節交換
在幾乎所有的機器上,多字節對象都被存儲為連續的字節序列。字節順序,是跨越多字節的程序對象的存儲規則。
-
大端模式:指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中,這樣的存儲模式有點兒類似于把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;這和我們的閱讀習慣一致。
-
小端模式:指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低。
例如在 C 語言中,一個類型為 int 的變量 x 地址為 0x100,那么其對應地址表達式&x的值為 0x100。且x的四個字節將被存儲在存儲器的 0x100, 0x101, 0x102, 0x103位置。
numpy.ndarray.byteswap() 函數將 ndarray 中每個元素中的字節進行大小端轉換。
十四、副本與視圖
副本是一個數據的完整的拷貝,如果我們對副本進行修改,它不會影響到原始數據,物理內存不在同一位置。
視圖是數據的一個別稱或引用,通過該別稱或引用亦便可訪問、操作原有數據,但原有數據不會產生拷貝。如果我們對視圖進行修改,它會影響到原始數據,物理內存在同一位置。
視圖一般發生在:
- 1、numpy 的切片操作返回原數據的視圖。
- 2、調用 ndarray 的 view() 函數產生一個視圖。
副本一般發生在:
- Python 序列的切片操作,調用deepCopy()函數。
- 調用 ndarray 的 copy() 函數產生一個副本。
十五、Numpy矩陣
函數返回一個新的矩陣 numpy.matlib.empty(shape, dtype, order) shape: 定義新矩陣形狀的整數或整數元組 Dtype: 可選,數據類型 order: C(行序優先) 或者 F(列序優先)numpy.matlib.zeros() 函數創建一個以 0 填充的矩陣。numpy.matlib.ones()函數創建一個以 1 填充的矩陣。函數返回一個矩陣,對角線元素為 1,其他位置為零。 numpy.matlib.eye(n, M,k, dtype) n: 返回矩陣的行數 M: 返回矩陣的列數,默認為 n k: 對角線的索引 dtype: 數據類型 numpy.matlib.identity() 函數返回給定大小的單位矩陣。numpy.matlib.rand() 函數創建一個給定大小的矩陣,數據是隨機填充的。十六、Numpy線性代數
對于兩個一維的數組,計算的是這兩個數組對應下標元素的乘積和(數學上稱之為內積);對于二維數組,計算的是兩個數組的矩陣乘積;對于多維數組,它的通用計算公式如下,即結果數組中的每個元素都是:數組a的最后一維上的所有元素與數組b的倒數第二位上的所有元素的乘積和: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])。 numpy.dot(a, b, out=None) a : ndarray 數組 b : ndarray 數組 out : ndarray, 可選,用來保存dot()的計算結果numpy.vdot() 函數是兩個向量的點積。 如果第一個參數是復數,那么它的共軛復數會用于計算。numpy.inner() 函數返回一維數組的向量內積。對于更高的維度,它返回最后一個軸上的和的乘積。numpy.matmul 函數返回兩個數組的矩陣乘積。 雖然它返回二維數組的正常乘積,但如果任一參數的維數大于2,則將其視為存在于最后兩個索引的矩陣的棧,并進行相應廣播。numpy.linalg.det() 函數計算輸入矩陣的行列式。numpy.linalg.solve() 函數給出了矩陣形式的線性方程的解。numpy.linalg.inv() 函數計算矩陣的乘法逆矩陣。?
轉載于:https://www.cnblogs.com/lpapython/p/10885201.html
總結
以上是生活随笔為你收集整理的数据分析之numpy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIBackgroundTaskIden
- 下一篇: maven打包不用eclipse插件