程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

利用python數據分析——Numpy基礎:通用函數、利用數組進行數據處理

編輯:Python

文章目錄

  • 1 通用函數
  • 2 利用數組進行數據處理
    • 2.1 np.meshgrid() 函數
    • 2.2 將條件邏輯表述為數組運算
    • 2.3 數學和統計方法
    • 2.4 用於布爾型數組的方法

1 通用函數

通用函數(ufunc)是一種對ndarray 中的數據執行元素級運算的函數。

  • 比如說sqrtexp
In [137]: arr = np.arange(10)
In [138]: arr
Out[138]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [139]: np.sqrt(arr)
Out[139]:
array([ 0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495,
2.6458, 2.8284, 3. ])
In [140]: np.exp(arr)
Out[140]:
array([ 1. , 2.7183, 7.3891, 20.0855, 54.5982,
148.4132, 403.4288, 1096.6332, 2980.958 , 8103.0839])
  • 還有一些函數,例如add或maximum,接收2個數組。(也叫作二元ufunc),並返回一個結果數組:
In [141]: x = np.random.randn(8)
In [142]: y = np.random.randn(8)
In [143]: x
Out[143]:
array([-0.0119, 1.0048, 1.3272, -0.9193, -1.5491, 0.0222, 0.7584,
-0.6605])
In [144]: y
Out[144]:
array([ 0.8626, -0.01 , 0.05 , 0.6702, 0.853 , -0.9559, -0.0235,
-2.3042])
In [145]: np.maximum(x, y)
Out[145]:
array([ 0.8626, 1.0048, 1.3272, 0.6702, 0.853 , 0.0222, 0.7584,
-0.6605])
  • 有些ufunc可以返回多個數組(但是不多)。例如modf是可以返回浮點數數組的小數和整數部分:
In [146]: arr = np.random.randn(7) * 5
In [147]: arr
Out[147]: array([-3.2623, -6.0915, -6.663 , 5.3731, 3.6182, 3.45 , 5.0077])
In [148]: remainder, whole_part = np.modf(arr)
In [149]: remainder
Out[149]: array([-0.2623, -0.0915, -0.663 , 0.3731,
0.6182, 0.45 , 0.0077])
In [150]: whole_part
Out[150]: array([-3., -6., -6., 5., 3., 3., 5.])

2 利用數組進行數據處理

NumPy 數組可以使得 多種數據處理任務表述為簡潔的 數組表達式(否則需要編寫循環)。

用數組表達式代替循環的做法,通常被稱為矢量化。

2.1 np.meshgrid() 函數

np.meshgrid() 函數指的是,根據所給的向量返回坐標矩陣。

舉例:
給的橫坐標是[1,2,3], 縱坐標是 [7, 8]
返回的是

[array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]

也就是代表了六個點,(1, 7) (2, 7) (3, 7) (1, 8) (2, 8) (3, 8)

#coding:utf-8
import numpy as np
# 坐標向量
a = np.array([1,2,3])
# 坐標向量
b = np.array([7,8])
# 從坐標向量中返回坐標矩陣
# 返回list,有兩個元素,第一個元素是X軸的取值,第二個元素是Y軸的取值
res = np.meshgrid(a,b)
#返回結果: [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]
  • 再舉一個例子:如果想要在一組網格上計算函數 sqrt(x^2 + y^2)
In [155]: points = np.arange(-5, 5, 0.01) # 1000 equally spaced points
In [156]: xs, ys = np.meshgrid(points, points)
In [157]: ys
Out[157]:
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
  • 現在,對該函數的求值運算就好辦了,把這兩個數組當做兩個浮點數那樣編寫表達式即可:
In [158]: z = np.sqrt(xs ** 2 + ys ** 2)
In [159]: z
Out[159]:
array([[ 7.0711, 7.064 , 7.0569, ..., 7.0499, 7.0569, 7.064 ],
[ 7.064 , 7.0569, 7.0499, ..., 7.0428, 7.0499, 7.0569],
[ 7.0569, 7.0499, 7.0428, ..., 7.0357, 7.0428, 7.0499],
...,
[ 7.0499, 7.0428, 7.0357, ..., 7.0286, 7.0357, 7.0428],
[ 7.0569, 7.0499, 7.0428, ..., 7.0357, 7.0428, 7.0499],
[ 7.064 , 7.0569, 7.0499, ..., 7.0428, 7.0499, 7.0569]])

2.2 將條件邏輯表述為數組運算

  • numpy.where 函數是三元表達式 x if condition else y 的矢量化版本。

首先,初始化兩個值數組和一個布爾數組:

In [165]: xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
In [166]: yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
In [167]: cond = np.array([True, False, True, True, False])
  • 要求是根據cond中的值,選取xarr和yarr中的值:當cond為True時,選擇xarr的值,否則從y中選取。

推導式方法:

In [168]: result = [(x if c else y)
.....: for x, y, c in zip(xarr, yarr, cond)]
In [169]: result
Out[169]: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
  • 上面的推導式對於大數組的處理不是很快(因為所有的工作由Python完成);而且無法用於多維數組。

  • 可以使用 np.where()

In [170]: result = np.where(cond, xarr, yarr)
In [171]: result
Out[171]: array([ 1.1, 2.2, 1.3, 1.4, 2.5])
  • 在數據分析工作中,where通常用於根據另一個數組而產生一個新的數組。

舉例,首先初始化一個arr數組。

In [172]: arr = np.random.randn(4, 4)
In [173]: arr
Out[173]:
array([[-0.5031, -0.6223, -0.9212, -0.7262],
[ 0.2229, 0.0513, -1.1577, 0.8167],
[ 0.4336, 1.0107, 1.8249, -0.9975],
[ 0.8506, -0.1316, 0.9124, 0.1882]])

然後,用arr>0 這個矢量表達式,得到一個bool數組。(這一步的工作不是必要的,是為了方便理解王np.where()函數)


In [174]: arr > 0
Out[174]:
array([[False, False, False, False],
[ True, True, False, True],
[ True, True, True, False],
[ True, False, True, True]], dtype=bool)
  • 需求:對於一個矩陣,希望將所有正數替換為2,所有負數替換為-2.

In [175]: np.where(arr > 0, 2, -2)
Out[175]:
array([[-2, -2, -2, -2],
[ 2, 2, -2, 2],
[ 2, 2, 2, -2],
[ 2, -2, 2, 2]])
  • 將標量和數組結合起來。還是剛剛的例子,只要將所有正值替換為2,其余數不變。
In [176]: np.where(arr > 0, 2, arr) # set only positive values to 2
Out[176]:
array([[-0.5031, -0.6223, -0.9212, -0.7262],
[ 2. , 2. , -1.1577, 2. ],
[ 2. , 2. , 2. , -0.9975],
[ 2. , -0.1316, 2. , 2. ]])

2.3 數學和統計方法

  • 感覺對我有用的方法是:argminargmaxcumsumcumprod

2.4 用於布爾型數組的方法

在上面這些方法中,布爾值會被強制轉換為1(True)和0(False)。因此,sum經常被用來對布爾型數組中的True值計數:

In [190]: arr = np.random.randn(100)
In [191]: (arr > 0).sum() # Number of positive values
Out[191]: 42
  • any用於測試數組中是否存在一個或多個True,而all則檢查數組中所有值是否都是True:
In [192]: bools = np.array([False, False, True, False])
In [193]: bools.any()
Out[193]: True
In [194]: bools.all()
Out[194]: False

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved