數據分析之Numpy

基礎

import numpy as np

# 一. 創建array

# array中的元素除了數字還可以是字符串和布爾值
date1 = [6.5, 2, 5, 4]

a = np.array(date1)
b = np.arange(10).reshape((2,5))
c = np.array([True, False])

print(a.ndim, a.shape, a.size)
print(b.ndim, b.shape, b.size)

print(np.ones((3,4)), np.ones_like(b))
print(np.zeros((3,4)), np.zeros_like(b))
print(np.empty((3,4)), np.empty_like(b))  # empty內的元素不是0,而是未初始化的垃圾值
print(np.eye(3))


# 二. 數據類型
print(a.dtype, b.dtype, c.dtype)
print(a.astype(np.int64), a)  # astype()可以改變數據類型,創建新數組,原數組保持不變(浮點數轉爲整數,小數部分直接被捨去)
print(c.astype(b.dtype), c)


# 三. 運算
arr = np.array([[1.,2.,3.,4.],
              [5.,6.,7.,8.]])

print(arr*arr, arr-arr, arr+arr, 1/arr, arr**0.5)  # 元素運算
print(arr.dot(arr.T), np.dot(arr, arr.T))  # 矩陣計算


# 四. 索引與切片
arr1 = np.arange(10)
print(
    arr1, arr1[5], arr1[5:8])

# 數值切片得到的是原始數組的視圖,所以改變切片的值時,會將值傳播到原數組中(廣播)

arr1[5:8] = 12
print(arr1)

arr1_slice = arr1[5:8]
arr1_slice[1] = 1234
print(arr1)

#  如果要得到切片的副本而不是視圖,要使用copy()函數
arr1_copy = arr1[5:8].copy()
arr1_copy[1] = 456
print(arr1_copy, arr1)

arr2d = np.arange(1, 10).reshape((3,3))
print(arr2d)
print(arr2d[0],arr2d[0,1])  # 第一行,第一行第二個元素
print(arr2d[1:,1:])  # 第二行到最後一行,第二列到最後一列
# 廣播效應
arr2d[0] = 123
print(arr2d)
arr2d[0] = [0,0,0]
print(arr2d)

arr3d=np.arange(1,13).reshape((2,2,3))
print(arr3d)
print(arr3d[0],arr3d[0,0],arr3d[0,0,0])
print(arr3d[:,:,1:])


# 布爾型索引
names = np.array(['bob','joe','will','bob','will','joe','joe'])
data=np.random.randn(7,4)  # 生成正態分佈隨機數
print(data)
print(names == 'bob')  # 生成布爾型數組
print(data[names == 'bob'])  # 選取TRUE對應的行
print(data[names == 'will',2:])  # 可用於切片
print(names != 'bob', (names == 'bob')|(names == 'will'), (names == 'bob')&(names == 'will'))  # 不等,或,且

data[data < 0] = 0  # 將小於0的值設爲0
print(data)
data[names != 'will'] = 7
print(data)

#  花式索引
arr2 = np.empty((8,4))
for i in range(8):
    arr2[i] = i
print(arr2)
print(arr2[[4,3,0,6]])  # 傳入指定順序的整數列表或者array即可選取對應行子集
print(arr2[[-5,-3,-7]])  # 負索引從末尾開始選取

print(arr2[[1,5,7,2],[0,3,1,2]])  # 注意一次傳入多個索引選出的是元素(1,0),(5,3),(7,1),(2,2)而不是子集
print(arr2[[1,5,7,2]][:, [0,3,1,2]])  # 要選出子集可以使用此方法或者使用以下np.ix_函數
print(arr2[np.ix_([1,5,7,2],[0,3,1,2])])


#  五. 轉置與軸對換
arr3 = np.arange(15).reshape((3,5))
print(arr3, arr3.T, arr3.transpose(1, 0))  # 除了用.T轉置之外還可以使用transpose()函數將原來的(0,1)軸轉成(1,0)軸

arr4 = np.arange(16).reshape((2,2,4))
print(arr4, arr4.transpose(1, 0, 2))  # 將原來的(0,1,2)軸轉成(1, 0, 2)
print(arr4.swapaxes(0, 1)) # swapaxes()只需寫出需要對換的軸即可.swapaxes(0, 1)等價於.transpose(1, 0, 2)
# 具體參照 https://blog.csdn.net/xiongchengluo1129/article/details/79017142


# 六. 通用函數
x = np.random.randn(8)
y = np.random.randn(8)

# 一元ufunc:接收一個array
print(x, y, np.abs(x), np.square(y), sep='\n')  # 還有如squrt,exp,log,sign,ceil,floor,rint,modf,isinf,cos,sin,tan,cosh等
# 二元ufunc:接收兩個array
print(np.add(x,y), np.maximum(x,y)) # 還有如multiply,divide,power,minimum,mod,subtract等

運算

import numpy as np
import matplotlib.pyplot as plt

# 計算函數sqrt(x^2+y^2)
# points = np.arange(-5, 5, 1)
# xs, ys = np.meshgrid(points, points)
# print(xs, ys)
# z=np.sqrt(xs**2+ys**2)
# plt.imshow(z, cmap=plt.cm.gray)
# plt.colorbar()
# plt.title('Image plot of $\sqrt{x^2+y^2}$ for a grid of values')
# plt.show()

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

# np.where() 等價於 x if condition else y
xarr = np.random.random(5)*5
yarr = np.random.random(5)*5
cond = np.array([1,0,1,1,0],dtype=np.bool)
print(xarr,yarr,np.where(cond,xarr,yarr),sep='\n')

# 第二個和第三個參數還可以是標量
arr = np.random.randn(4,4)
print(arr, np.where(arr >0, 2, -2), np.where(arr > 0, 2, arr), sep='\n')

#  多重嵌套
result = np.where(cond[0]&cond[1], 0,
                    np.where(cond[1], 1,
                        np.where(cond[2], 2, 3)))
print(result)


# 二. 數學與統計方法

print(arr.mean(), np.sum(arr), np.mean(arr,axis=0), arr.sum(1))  # axis參數可以指定對某一軸進行統計計算
print(arr.cumsum(0), arr.cumprod(1), sep='\n')
# sum:求和
# mean:算數平均
# std,var:標準差,方差
# min,max:最小值,最大值
# argmin,argmax:最大值和最小值索引
# cumsum:所以元素累積和https://blog.csdn.net/banana1006034246/article/details/78841461
# cumprod:所以元素累積積

# 布爾型數組方法
rant = np.random.randn(100)
print((rant > 0).sum())  # 計算大於0的個數
print((rant > 0).any(), (rant > 0).all())  # any()是否有非零數,all()是否都是非零數

# 排序
arrant = np.random.randn(8)
arrant1 = np.random.randn(4,4)
print(arrant)
arrant.sort()
print(arrant)  # 會改變數組本身
print(arrant1)
arrant1.sort(1)  # 對指定軸排序
print(arrant1)

# 集合邏輯

# unique(x) 得到數組x唯一元素,有序輸出
# intersect1d(x,y) x和y的公共元素,有序輸出
# union1d(x,y) x和y的並集,有序輸出
# in1d(x,y) x的元素是否包含y的布爾型數組
# setdiff1d(x,y) x和y的差
# setxor1d(x,y) x和y的對稱差


# 三. 文件輸入輸出
np.save('arrant', arrant)
np.savez('arrants', a=arrant, b=arrant1)  # savez可以寫入多個數組,數組以關鍵字參數形式輸入
f = np.load('arrant.npy')
g = np.load('arrants.npz')  # 加載npz時,得到類字典對象
print(f, g['a'], g['b'])
# np.savetxt('file.txyt',delimiter=',') 保存TXT文件,以,爲分隔符
# np.loadtxt('file.txt',delimiter=',')  以,爲分隔符讀取TXT文件


# 四. 線性代數numpy.linalg
# diag 對角線
# dot 矩陣乘法
# trace 矩陣的跡
# det 矩陣行列式
# eig 矩陣特徵值與特徵向量
# inv 逆矩陣
# pinv 矩陣的僞逆
# qr 矩陣的qr分解
# svd 奇異值分解
# solve 解Ax=b
# lstsq Ax=b的最小二乘解


# 五.隨機數numpy.random
# seed 確定隨機數生成器的種子
# shuffle 對一序列隨機排列
# rand 均勻分佈
# randint 在給定上下限中隨機選取整數
# randn 均值爲0,標準差爲1的正態分佈
# binomial 二項分佈
# normal 高斯分佈
# beta beta分佈
# chisquare 卡方分佈
# gamma gamma分佈
# uniform [0,1)中的均勻分佈

例子

import numpy as np

nwalk = 1000
ntime = 1000

arr = np.random.randint(0, 2, nwalk)
arr = np.where(arr > 0, 1, -1).cumsum()

print(arr.max(), arr.min())

print((np.abs(arr) >= 10).argmax())  # 第一次偏離原地大於等於10的步數


arrs = np.random.randint(0, 2, (ntime, nwalk))  # 一次進行1000個實驗
arrs = np.where(arrs > 0, 1, -1).cumsum(1)

print(arrs.max(), arrs.min())

hit30 = (np.abs(arrs) >= 30).any(1)
print(hit30.sum())  # 偏離超過30的實驗的次數

mean_cross_time = (np.abs(arrs[hit30]) >= 30).argmax(1).mean()
print(mean_cross_time)  # 首次偏離超過30的平均步數

 

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