利用python進行數據分析-NumPy基礎2

1.利用數組進行數據處理

import numpy as np
import matplotlib.pyplot as plt

points=np.arange(-5,5,0.01)
xs,ys=np.meshgrid(points,points)
print xs
print ys
z=np.sqrt(xs**2+ys**2)
print z

plt.imshow(z,cmap=plt.cm.gray)
plt.colorbar()
plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")

結果爲:

[[-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]
 ...,
 [-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...,  4.97  4.98  4.99]]
[[-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]]
[[ 7.07106781  7.06400028  7.05693985 ...,  7.04988652  7.05693985
   7.06400028]
 [ 7.06400028  7.05692568  7.04985815 ...,  7.04279774  7.04985815
   7.05692568]
 [ 7.05693985  7.04985815  7.04278354 ...,  7.03571603  7.04278354
   7.04985815]
 ...,
 [ 7.04988652  7.04279774  7.03571603 ...,  7.0286414   7.03571603
   7.04279774]
 [ 7.05693985  7.04985815  7.04278354 ...,  7.03571603  7.04278354
   7.04985815]
 [ 7.06400028  7.05692568  7.04985815 ...,  7.04279774  7.04985815
   7.05692568]]


2.將條件邏輯表述爲數組運算

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

xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond=np.array([True,False,True,True,False])
#當cond中的值爲True時,選取xarr的值,否則從yarr中選取
result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
print result

結果爲:

[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]

有幾個問題,第一它對數組處理的速度不是很快(因爲所有的工作都是由純Python完成的),第二無法用於多維數組;若使用np.where則可以將該功能寫得非常簡潔

result2=np.where(cond,xarr,yarr)
print result2

在數據分析工作中,where通常用於根據另一個數組而產生一個新的數組

arr1=np.random.randn(4,4)
print arr1
print np.where(arr1>0,2,-2)
#只將正值設置爲2
print np.where(arr1>0,2,arr1)

結果爲:

[[ 1.83291507 -1.58867214  0.90637336  1.02499554]
 [ 0.86381994 -0.70843411 -1.16839393  0.55131969]
 [-0.54296123 -1.13171815  0.29734885  0.91681327]
 [-1.28282116 -1.32990481  0.10191195  0.78844874]]
[[ 2 -2  2  2]
 [ 2 -2 -2  2]
 [-2 -2  2  2]
 [-2 -2  2  2]]
[[ 2.         -1.58867214  2.          2.        ]
 [ 2.         -0.70843411 -1.16839393  2.        ]
 [-0.54296123 -1.13171815  2.          2.        ]
 [-1.28282116 -1.32990481  2.          2.        ]]

想象一下,我有兩個布爾型數組cond1和cond2,希望根據4種不同的布爾值組合實現不同的賦值操作:

np.where(cond1 && cond2,0,np.where(cond1,1,np.where(cond2,2,3)))


3.數學和統計方法

arr2=np.random.randn(5,4)
print arr2
print arr2.mean()
print np.mean(arr2)
print arr2.sum()
#mean和sum這類的函數可以接受一個axis參數(用於計算該軸向上的統計值),最終結果是一個少一維的數組
print arr2.mean(axis=1)
print arr2.sum(0)

結果爲:

[[ 0.04421807  0.05579019  0.49073741  1.83844835]
 [-0.85086233  0.82695888 -1.17963151  0.61080947]
 [ 1.6517786   0.64147281  0.39856902  1.58321548]
 [ 0.09581811  0.855853    3.08102977  1.15668835]
 [-1.66410818 -1.17020397  2.14328362  2.20244502]]
0.640615506991
0.640615506991
12.8123101398
[ 0.6072985  -0.14818138  1.06875898  1.29734731  0.37785412]
[-0.72315573  1.20987091  4.9339883   7.39160666]


其它如cumsum和cumprod之類的方法則不聚合,而是產生一個由中間結果組成的數組

arr3=np.array([[0,1,2],[3,4,5],[6,7,8]])
print arr3
print arr3.cumsum(0)
print arr3.cumprod(1)

結果爲:

[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 0  1  2]
 [ 3  5  7]
 [ 9 12 15]]
[[  0   0   0]
 [  3  12  60]
 [  6  42 336]]



4.用於布爾型數組的方法

arr4=np.random.randn(100)
print (arr4>0).sum()

結果爲:

41


另外兩個方法any和all;any用於測試數組中是否存在一個或多個True,而all則檢查數組中所有值是否都是True

bools=np.array([False,False,True,False])
print bools.any()
print bools.all()

結果爲:

True
False


5.排序

arr5=np.random.randn(8)
print arr5
arr5.sort()
print arr5

結果爲:

[-0.62678434 -1.05703028 -1.35622726  1.84139748 -1.38915508  0.75303163
  0.75268662  0.95393155]
[-1.38915508 -1.35622726 -1.05703028 -0.62678434  0.75268662  0.75303163
  0.95393155  1.84139748]


多維數組可以在任何一個軸上向上進行排序,只需將軸編號傳給sort即可
arr6=np.random.randn(5,3)
print arr6
arr6.sort(1)
print arr6

結果爲:

[[-2.83279139  0.37453421 -0.21970014]
 [-1.06526559 -0.81824136  1.25382975]
 [ 0.37518822  1.8481579   0.22969846]
 [ 0.51275331 -0.58014161  0.90958922]
 [-0.05234053 -0.82511264  1.04263001]]
[[-2.83279139 -0.21970014  0.37453421]
 [-1.06526559 -0.81824136  1.25382975]
 [ 0.22969846  0.37518822  1.8481579 ]
 [-0.58014161  0.51275331  0.90958922]
 [-0.82511264 -0.05234053  1.04263001]]

頂級方法np.sort返回的是數組的已排序副本,而就地排序則會修改數組本身。


6.唯一化以及其他的集合邏輯

numpy提供了一些針對一維ndarray的基本集合運算。最常用的可能要數np.unique了,它用於找出數組中唯一值並返回已排序的結果

names=np.array(['zhuheng','xiaoyang','zhuheng','benben','xiaoyang','zhuheng'])
print np.unique(names)

結果爲:

['benben' 'xiaoyang' 'zhuheng']

另一個函數np.in1d用於測試一個數組中的值在另一個數組中的成員資格,返回一個布爾型數組

values=np.array([6,0,0,3,2,5,6])
print np.in1d(values,[2,3,6])

結果爲:

[ True False False  True  True False  True]


7.用於數組的文件輸入輸出

numpy能夠讀寫磁盤上的文本數據或二進制數據


8.將數組以二進制格式保存到磁盤

np.save和np.load是讀寫磁盤數組數據的兩個主要函數。默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名爲.np的文件中的。

arr7=np.arange(10)
np.save('some_array',arr7)
print np.load('some_array.npy')

結果爲:

[0 1 2 3 4 5 6 7 8 9]

通過np.savez可以將多個數組保存到一個壓縮文件中,將數組以關鍵字參數的形式傳入即可

np.savez('array_archive.npz',a=arr7,b=arr7)
arch=np.load('array_archive.npz')
print arch['b']

結果爲:

[0 1 2 3 4 5 6 7 8 9]


8.存取文本文件

arr=np.loadtxt('array_ex.txt',delimiter=',')

print arr


9.線性代數

線性代數(如矩陣乘法,矩陣分解,行列式以及其他方陣數學等)是任何數組庫的重要組成部分。numpy提供了一個用於矩陣乘法的dot函數

y=np.array([[6.,23.],[-1,7],[8,9]])
print x
print y
print x.dot(y)#相當於np.dot(x,y)

結果爲:
[[ 1.  2.  3.]
 [ 4.  5.  6.]]
[[  6.  23.]
 [ -1.   7.]
 [  8.   9.]]
[[  28.   64.]
 [  67.  181.]]

分解爲:

1*6+2*(-1)+3*8=28

1*23+2*7+3*9=64

4*6+5*(-1)+6*8=67

4*23+5*7+6*9=181

一個二維數組跟一個大小合適的一維數組的矩陣點積運算之後將會得到一個一維數組


numpy.linalg中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西。


10.隨機數生成

samples=np.random.normal(size=(4,4))
print samples

結果爲:

[[-0.46232145  1.4761271   0.45452099 -0.29462295]
 [ 0.43802714 -1.21157471  1.46811933  0.34658873]
 [ 0.85083095 -0.71980021  0.82286834 -0.7895309 ]
 [-0.20216229 -0.97692473 -1.67194947  2.00320505]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章