Numpy基礎 --陣列和向量計算 利用Python進行資料分析讀書筆記
Numpy 陣列和向量計算
import numpy as np
#ndarray物件 陣列 NumPy陣列
建立ndarray
data1=[6,7.5,8,0,1]
arr1=np.array(data1)
arr1
array([ 6. , 7.5, 8. , 0. , 1. ])
data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
arr2.ndim
2
arr2.shape
(2, 4)
arr1.dtype
dtype('float64')
arr2.dtype
dtype('int32')
np.zeros(10)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,6))
array([[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.]])
np.empty((2,3,2))
array([[[ 1.37556714e-311, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]], [[ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]]])
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
arr3=np.array([1,2,3],dtype=np.float64)
arr4=np.array([1,2,3],dtype=np.int32)
arr3.dtype
dtype('float64')
arr4.dtype
dtype('int32')
arr5=np.array([1,2,3,4,5])
arr5.dtype
dtype('int32')
float_arr5=arr5.astype(np.float64)
float_arr5.dtype
dtype('float64')
arr6=np.array([3.7,1.2,3.5,6.4,-0.5,0.9])
arr6
array([ 3.7, 1.2, 3.5, 6.4, -0.5, 0.9])
arr6.astype(np.int32)
array([3, 1, 3, 6, 0, 0])
numeric_strings=np.array(['1.25','3.44','5.64'],dtype=np.string_)
numeric_strings.astype(float)
array([ 1.25, 3.44, 5.64])
int_array=np.arange(10)
calibers=np.array([.22,.270,.357,.380,.44,.50],dtype=np.float64)
int_array.astype(calibers.dtype)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
empty_uint32=np.empty(8,dtype='u4')
empty_uint32
array([0, 0, 1, 0, 2, 0, 3, 0], dtype=uint32)
#呼叫astype就會建立一個新的陣列
陣列和標量之間的運算
#陣列很重要,因為它使你不用編寫迴圈即可對資料執行批量運算,這通常就叫做向量化(vectorization
arr=np.array([[1.,2.,3.],[4.,5.,6.]])
arr
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
arr*arr
array([[ 1., 4., 9.],
[ 16., 25., 36.]])
1/arr
array([[ 1. , 0.5 , 0.33333333],
[ 0.25 , 0.2 , 0.16666667]])
arr*0.5
array([[ 0.5, 1. , 1.5],
[ 2. , 2.5, 3. ]])
基本的索引和切片
arr=np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
arr[5:8]
array([5, 6, 7])
arr[5:8]=12
arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr_slice=arr[5:8]
arr_slice[1]=12345
arr
array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])
arr_slice[:]=64
arr
array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
#陣列切片是原始陣列的檢視,檢視上的任何修改都會直接反映到源陣列上
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[2]
array([7, 8, 9])
arr2d[0][2]
3
arr2d[0,2]
3
arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
old_values=arr3d[0].copy()
arr3d[0]=42
arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0]=old_values
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[1,0]
array([7, 8, 9])
arr[1:6]
array([ 1, 2, 3, 4, 64])
arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[:2]
array([[1, 2, 3],
[4, 5, 6]])
arr2d[:2,1:]
array([[2, 3],
[5, 6]])
arr2d[1,:2]
array([4, 5])
arr2d[2,:1]
array([7])
arr2d[:,:1]
array([[1],
[4],
[7]])
布林型索引
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data=np.random.randn(7,4)
names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],
dtype='<U4')
data
array([[ 1.60975139e-03, -3.23542576e-01, 1.76647590e+00,
1.00434873e-01],
[ -1.00265678e+00, -2.06101922e-01, -1.98938974e+00,
1.03029242e-01],
[ -4.59143820e-01, 6.32877040e-01, 6.65959171e-02,
-9.06221248e-01],
[ 1.69835755e-01, -3.53395803e-01, 1.05681390e+00,
-4.89362964e-01],
[ -1.63716077e+00, 3.09182690e+00, -2.81776081e-01,
6.14541313e-01],
[ 8.23892259e-01, -6.11722686e-01, 6.27307169e-01,
-3.55724014e-02],
[ 1.71960690e+00, 2.35358233e-01, -1.58146445e+00,
1.11900395e+00]])
names=='Bob'
array([ True, False, False, True, False, False, False], dtype=bool)
data[names=='Bob']
array([[ 1.60975139e-03, -3.23542576e-01, 1.76647590e+00,
1.00434873e-01],
[ 1.69835755e-01, -3.53395803e-01, 1.05681390e+00,
-4.89362964e-01]])
data[names=='Bob',2:]
array([[ 1.7664759 , 0.10043487],
[ 1.0568139 , -0.48936296]])
data[names=='Bob',3]
array([ 0.10043487, -0.48936296])
names!='Bob'
array([False, True, True, False, True, True, True], dtype=bool)
data[~(names=='Bob')]
array([[-1.00265678, -0.20610192, -1.98938974, 0.10302924],
[-0.45914382, 0.63287704, 0.06659592, -0.90622125],
[-1.63716077, 3.0918269 , -0.28177608, 0.61454131],
[ 0.82389226, -0.61172269, 0.62730717, -0.0355724 ],
[ 1.7196069 , 0.23535823, -1.58146445, 1.11900395]])
mask=(names=='Bob')|(names=='Will')
mask
array([ True, False, True, True, True, False, False], dtype=bool)
data[mask]
array([[ 1.60975139e-03, -3.23542576e-01, 1.76647590e+00,
1.00434873e-01],
[ -4.59143820e-01, 6.32877040e-01, 6.65959171e-02,
-9.06221248e-01],
[ 1.69835755e-01, -3.53395803e-01, 1.05681390e+00,
-4.89362964e-01],
[ -1.63716077e+00, 3.09182690e+00, -2.81776081e-01,
6.14541313e-01]])
data[data<0]=0
data
array([[ 1.60975139e-03, 0.00000000e+00, 1.76647590e+00,
1.00434873e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.03029242e-01],
[ 0.00000000e+00, 6.32877040e-01, 6.65959171e-02,
0.00000000e+00],
[ 1.69835755e-01, 0.00000000e+00, 1.05681390e+00,
0.00000000e+00],
[ 0.00000000e+00, 3.09182690e+00, 0.00000000e+00,
6.14541313e-01],
[ 8.23892259e-01, 0.00000000e+00, 6.27307169e-01,
0.00000000e+00],
[ 1.71960690e+00, 2.35358233e-01, 0.00000000e+00,
1.11900395e+00]])
data[names!='Joe']=7
data
array([[ 7. , 7. , 7. , 7. ],
[ 0. , 0. , 0. , 0.10302924],
[ 7. , 7. , 7. , 7. ],
[ 7. , 7. , 7. , 7. ],
[ 7. , 7. , 7. , 7. ],
[ 0.82389226, 0. , 0.62730717, 0. ],
[ 1.7196069 , 0.23535823, 0. , 1.11900395]])
花式索引
指的是利用整數陣列進行索引。
arr=np.empty((8,4))
for i in range(8):
arr[i]=i
arr
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
arr[[4,3,0,6]]
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
arr[[-3,-5,-7]]
array([[ 5., 5., 5., 5.],
[ 3., 3., 3., 3.],
[ 1., 1., 1., 1.]])
arr=np.arange(32).reshape((8,4))
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
記住,花式索引跟切片不一樣,它總是將資料複製到新陣列中。
陣列轉置和軸對稱
轉置(transpose)是重塑的一種特殊形式,它返回的是源資料的檢視(不會進行任何複製操作)。
arr=np.arange(15).reshape((3,5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
arr=np.random.randn(6,3)
np.dot(arr.T,arr)
array([[ 8.84595216, 2.30542093, 3.92854057],
[ 2.30542093, 2.28401128, 1.73860755],
[ 3.92854057, 1.73860755, 9.77924613]])
arr=np.arange(16).reshape((2,2,4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.swapaxes(1,2)#也是返回源資料的檢視,不會進行任何複製操作
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
通用函式:快速的元素級資料函式
arr=np.arange(10)
np.sqrt(arr)
array([ 0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr)
array([ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00,
2.00855369e+01, 5.45981500e+01, 1.48413159e+02,
4.03428793e+02, 1.09663316e+03, 2.98095799e+03,
8.10308393e+03])
x=np.random.randn(8)
y=np.random.randn(8)
x
array([-1.55455343, 0.58957206, 1.12291564, 0.84985964, 1.81809564,
0.96211051, 0.03536402, -0.29113791])
y
array([ 1.35585258, -0.18208383, -0.96881932, -0.97084842, 0.15031288,
-0.21753205, -0.12555617, 1.07649061])
np.maximum(x,y)
array([ 1.35585258, 0.58957206, 1.12291564, 0.84985964, 1.81809564,
0.96211051, 0.03536402, 1.07649061])
arr=np.random.randn(7)*5
np.modf(arr)
(array([-0.99321578, 0.62223866, 0.32422504, -0.20182624, -0.74306072,
-0.10960894, 0.95203083]), array([-2., 2., 2., -4., -1., -6., 5.]))
np.fabs(arr)
array([ 2.99321578, 2.62223866, 2.32422504, 4.20182624, 1.74306072,
6.10960894, 5.95203083])
利用陣列進行資料處理
points=np.arange(-5,5,0.01)#1000個間隔相等的點
xs,ys=np.meshgrid(points,points)
ys
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]])
import matplotlib.pyplot as plt
z=np.sqrt(xs**2+ys**2)
z
array([[ 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]])
plt.imshow(z,cmap=plt.cm.gray)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x28840dd65c0>
plt.title('Image plot of $\sqrt(x^2+y^2)$ for a grid of values')
<matplotlib.text.Text at 0x28841041dd8>
將條件邏輯表述為陣列運算
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])
result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
result
[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
result=np.where(cond,xarr,yarr)
result
array([ 1.1, 2.2, 1.3, 1.4, 2.5])
arr=np.random.randn(4,4)
arr
array([[-1.124892 , 0.16102557, -0.84624401, -1.61350592],
[ 0.93525737, -1.97957635, -2.53954932, 0.79295019],
[-1.40451591, 0.31596234, -1.43060903, -1.61587221],
[-1.00342438, 0.88479574, 1.52961242, 0.72461918]])
np.where(arr>0,2,-2)
array([[-2, 2, -2, -2],
[ 2, -2, -2, 2],
[-2, 2, -2, -2],
[-2, 2, 2, 2]])
np.where(arr>0,2,arr)
array([[-1.124892 , 2. , -0.84624401, -1.61350592],
[ 2. , -1.97957635, -2.53954932, 2. ],
[-1.40451591, 2. , -1.43060903, -1.61587221],
[-1.00342438, 2. , 2. , 2. ]])
數學和統計方法
arr=np.random.randn(5,4)#正態分佈的資料
arr.mean()
0.22588105368397526
np.mean(arr)
0.22588105368397526
arr.sum()
4.5176210736795053
arr.mean(axis=1)
array([ 0.67230987, 0.01274547, 0.18780888, 0.54016805, -0.283627 ])
arr.sum(0)
array([ 0.06725924, 0.51484031, 1.7496478 , 2.18587372])
arr=np.array([[0,1,2],[3,4,5],[6,7,8]])
arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr.cumsum(0)
array([[ 0, 1, 2],
[ 3, 5, 7],
[ 9, 12, 15]], dtype=int32)
arr.cumprod(1)
array([[ 0, 0, 0],
[ 3, 12, 60],
[ 6, 42, 336]], dtype=int32)
用於布林型陣列的方法
arr=np.random.randn(100)
(arr>0).sum() #正值的數量
49
bools=np.array([False,False,True,False])
bools.any()#測試陣列中是否存在一個或多個True
True
bools.all()#測試陣列中所有值是否都是True
False
排序
arr=np.random.randn(8)
arr
array([ 0.19051791, -0.9561823 , -0.88527884, 1.72500065, 0.7121868 ,
-0.98016434, -0.62017177, 1.56115109])
arr.sort()
arr
array([-0.98016434, -0.9561823 , -0.88527884, -0.62017177, 0.19051791,
0.7121868 , 1.56115109, 1.72500065])
arr=np.random.randn(5,3)
arr
array([[ 2.18671772, -0.52656283, 0.9128075 ],
[-0.60204952, 0.71479588, -0.03902287],
[-0.63784626, -1.89380845, -0.28438434],
[ 1.22924442, 0.16689474, -0.63089802],
[ 0.72705863, 2.18074376, 0.47051067]])
arr.sort(1)#這裡屬於就地排序,會改變原始陣列
arr
array([[-0.52656283, 0.9128075 , 2.18671772],
[-0.60204952, -0.03902287, 0.71479588],
[-1.89380845, -0.63784626, -0.28438434],
[-0.63089802, 0.16689474, 1.22924442],
[ 0.47051067, 0.72705863, 2.18074376]])
唯一化以及其他的集合邏輯
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
np.unique(names)
array(['Bob', 'Joe', 'Will'],
dtype='<U4')
ints=np.array([3,3,4,2,1,3,2,4])
np.unique(ints)
array([1, 2, 3, 4])
sorted(set(names))
['Bob', 'Joe', 'Will']
#np.in1d用於測試一個數組中的值在另一個數組中的成員資格,返回一個布林型陣列
values=np.array([6,0,0,3,2,5,6])
np.in1d(values,[2,3,6])
array([ True, False, False, True, True, False, True], dtype=bool)
用於陣列的檔案輸入輸出
arr=np.arange(10)
np.save('ch04/some_array',arr)
np.load('ch04/some_array.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#將多個數組儲存到一個壓縮檔案中
np.savez('ch04/array_archive.npz',a=arr,b=arr)
#載入.npz檔案時,你會得到一個類似字典的物件
arch=np.load('ch04/array_archive.npz')
arch['b']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
存取文字檔案
arr=np.loadtxt('ch04/array_ex.txt',delimiter=',')
arr
array([[ 0.580052, 0.18673 , 1.040717, 1.134411],
[ 0.194163, -0.636917, -0.938659, 0.124094],
[-0.12641 , 0.268607, -0.695724, 0.047428],
[-1.484413, 0.004176, -0.744203, 0.005487],
[ 2.302869, 0.200131, 1.670238, -1.88109 ],
[-0.19323 , 1.047233, 0.482803, 0.960334]])
np.savetxt('ch04/array_txt.txt',arr,delimiter=' ',newline='\n')
線性代數
x=np.array([[1.,2.,3.],[4.,5.,6.]])
y=np.array([[6.,23.],[-1,7],[8,9]])
x
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
y
array([[ 6., 23.],
[ -1., 7.],
[ 8., 9.]])
x.dot(y)#相當於np.dot(x,y)
array([[ 28., 64.],
[ 67., 181.]])
#一個二維陣列跟一個大小合適的一維陣列的矩陣點積運算之後將會得到一個一維陣列
np.dot(x,np.ones(3))
array([ 6., 15.])
#numpy.linalg中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西。
from numpy.linalg import inv,qr
X=np.random.randn(5,5)
mat=X.T.dot(X)
mat
array([[ 3.52812683, 0.50014532, -1.33983697, 1.65988419, -0.76535951],
[ 0.50014532, 4.08419311, -2.5690617 , -0.16615284, -3.74006228],
[-1.33983697, -2.5690617 , 2.72421214, -0.13432057, 4.16986366],
[ 1.65988419, -0.16615284, -0.13432057, 3.2039997 , -0.87473058],
[-0.76535951, -3.74006228, 4.16986366, -0.87473058, 8.06038483]])
inv(mat)
array([[ 54.04030339, 25.14468473, 138.84119709, -36.99114311,
-59.04224289],
[ 25.14468473, 12.31566469, 65.26559276, -17.16636841,
-27.52455358],
[ 138.84119709, 65.26559276, 359.29868506, -95.18079197,
-152.73752953],
[ -36.99114311, -17.16636841, -95.18079197, 25.66540608,
40.54724899],
[ -59.04224289, -27.52455358, -152.73752953, 40.54724899,
65.1619639 ]])
mat.dot(inv(mat))
array([[ 1.00000000e+00, -1.42108547e-14, -2.84217094e-14,
1.42108547e-14, -1.42108547e-14],
[ -2.84217094e-14, 1.00000000e+00, 1.13686838e-13,
-5.68434189e-14, -8.52651283e-14],
[ 2.84217094e-14, 0.00000000e+00, 1.00000000e+00,
0.00000000e+00, 5.68434189e-14],
[ -7.10542736e-15, -7.10542736e-15, -5.68434189e-14,
1.00000000e+00, -7.10542736e-15],
[ 1.13686838e-13, 2.84217094e-14, 0.00000000e+00,
-5.68434189e-14, 1.00000000e+00]])
q,r=qr(mat)
r
array([[ -4.22302950e+00, -2.32915443e+00, 3.09645494e+00,
-2.82756748e+00, 4.20997326e+00],
[ 0.00000000e+00, -5.66758935e+00, 4.67966804e+00,
5.91077981e-01, 8.21617203e+00],
[ 0.00000000e+00, 0.00000000e+00, -1.31721365e+00,
1.90947603e-01, -3.21644932e+00],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
-2.33466484e+00, 1.45658073e+00],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 5.46664408e-03]])
隨機數生成
samples=np.random.randn(4,4)
samples
array([[ 1.5404748 , -0.92115435, 1.00509721, 0.43422671],
[ 0.69277073, 0.18068919, 0.60346547, -0.35861855],
[ 1.05033574, 1.16613186, -1.0336046 , -0.71084958],
[-0.06515771, 1.3693006 , 1.40907517, -0.94190917]])
#範例:隨機漫步
nsteps=1000
draws=np.random.randint(0,2,size=nsteps)
steps=np.where(draws>0,1,-1)
walk=steps.cumsum()
walk.min()
-25
walk.max()
7
(np.abs(walk)>=10).argmax()
65
###一次模擬多個隨機漫步
nwalks=5000
nsteps=1000
draws=np.random.randint(0,2,size=(nwalks,nsteps))#0或1
steps=np.where(draws>0,1,-1)
walks=steps.cumsum(1)#沿著第二個軸方向累加
walks
array([[ 1, 2, 3, ..., -28, -29, -30],
[ -1, 0, 1, ..., 10, 11, 12],
[ 1, 2, 3, ..., 46, 47, 48],
...,
[ -1, -2, -3, ..., 0, 1, 0],
[ -1, 0, 1, ..., -8, -7, -8],
[ 1, 2, 3, ..., 44, 43, 42]], dtype=int32)
walks.max()
146
walks.min()
-114
hits30=(np.abs(walks)>=30).any(1)
hits30
array([ True, False, True, ..., False, True, True], dtype=bool)
hits30.sum()#到達30或-30的數量
3417
crossing_times=(np.abs(walks[hits30])>=30).argmax(1)
crossing_times.mean()
500.91747146619844
相關推薦
Numpy基礎 --陣列和向量計算 利用Python進行資料分析讀書筆記
Numpy 陣列和向量計算 程式碼下載 import numpy as np #ndarray物件 陣列 NumPy陣列 建立ndarray data1=[6,7.5,8,0,1] arr1=np.array(data1) a
python numpy基礎 陣列和向量計算
在python 中有時候我們用陣列操作資料可以極大的提升資料的處理效率, 類似於R的向量化操作,使得資料的操作趨於簡單化,在python 中是使用numpy模組可以進行陣列和向量計算。 下面來看下簡單的例子 import n
利用Python進行資料分析閱讀筆記(一)
資料規整化:清理,轉換,合併,重塑 轉置(transpose) 實現的幾種方式: import numpy as np arr = np.arange(15).reshape((3,5)) print(arr) print(arr.T) pri
《利用Python進行資料分析》筆記及案例
《利用Python進行資料分析》 本書算是資料分析領域絕對經典的一本書了,動物書系列基本都是比較值得學習的範本。 針對科學計算領域的Python開源庫生態系統,在過去十幾年間得到了飛速發展,本書對剛剛接觸資料分析和統計應用的Python程式設計師,提供了集中
《利用Python進行資料分析》筆記二
第七章----->最後資料的準備:載入、清理、轉換、重塑合併資料集pandas物件中的資料可以通過內建的方式進行合併資料庫風格的dataframe合併合併(merge)或連線(join)索引上的合併可以傳入left_index=True或right_index=True
資料集合與分組運算 《利用python進行資料分析》筆記,第9章
pandas的groupby功能,可以計算 分組統計和生成透視表,可對資料集進行靈活的切片、切塊、摘要等操作 GroupBy技術 “split-apply-comebine”(拆分-應用-合併) import numpy as np from pand
利用python進行資料分析學習筆記-Pandas篇
無論如何,堅持啊! pandas的資料結構 Series obj = Series([]) #產生一個Series obj = Series({})#可以通過引入一個dict來建立一個Series 包括values和index兩個屬性,而valu
《利用Python進行資料分析》筆記---第2章--MovieLens 1M資料集
寫在前面的話: 還有一定要說明的: 我使用的是Python2.7,書中的程式碼有一些有錯誤,我使用自己的2.7版本調通。 # coding: utf-8 import pandas a
《利用Python進行資料分析》筆記---第9章資料聚合與分組運算
寫在前面的話: 還有一定要說明的: 我使用的是Python2.7,書中的程式碼有一些有錯誤,我使用自己的2.7版本調通。 # coding: utf-8 from pandas import Series, DataFrame import p
資料基礎---《利用Python進行資料分析·第2版》第4章 NumPy基礎:陣列和向量計算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 NumPy(Numerical Python的簡稱)是Python數值計算最重要的基礎包。大多數提供科學計算的包都是用Nu
利用python進行資料分析-----第二篇 Numpy 陣列 向量計算 索引 切片 轉置 軸對換 檔案輸入輸出
目錄 布林值索引 花式索引 其他函式 排序 線性代數 隨機數生成 Numpy簡介 NumPy是一種通用的陣列處理軟體包,旨在有效地操縱任意記錄的大型多維陣列,而不會為小
01- Numy基礎:陣列和向量計算
1. NumPy基礎:陣列和向量計算 NumPy (Numeriacal /njuː’merɪk(ə)l/ Python)是高效能科學計算和資料分析的基礎包。 它是幾乎所有高階工具的構建基礎,其部分功能如下: Ndarray,一個具有向量算術運算和複雜廣
資料基礎---《利用Python進行資料分析·第2版》第8章 資料規整:聚合、合併和重塑
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在許多應用中,資料可能分散在許多檔案或資料庫中,儲存的形式也不利於分析。本章關注可以聚合、合併、重塑資料的方法。 首先
資料基礎---《利用Python進行資料分析·第2版》第7章 資料清洗和準備
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的80%或更多。
【利用python進行資料分析——基礎篇】利用Python處理和分析Excel表中資料實戰
作為一個學習用Python進行資料分析的新手來說,通過本文來記錄分享一些我在用Python中的pandas、numpy來分析Excel表中資料的資料清洗和整理的工作,目的是熟悉numpy以及pandas基礎操作,所有操作利用Excel均可以方便實現。備註:本文中使用的是ipy
資料基礎---《利用Python進行資料分析·第2版》第12章 pandas高階應用
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 前面的章節關注於不同型別的資料規整流程和NumPy、pandas與其它庫的特點。隨著時間的發展,pandas發展出了更多適
資料基礎---《利用Python進行資料分析·第2版》第6章 資料載入、儲存與檔案格式
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 訪問資料是使用本書所介紹的這些工具的第一步。我會著重介紹pandas的資料輸入與輸出,雖然別的庫中也有不少以此為目的的工具
資料基礎---《利用Python進行資料分析·第2版》第11章 時間序列
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 時間序列(time series)資料是一種重要的結構化資料形式,應用於多個領域,包括金融學、經濟學、生態學、神經科學、物
資料基礎---《利用Python進行資料分析·第2版》第10章 資料聚合與分組運算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 對資料集進行分組並對各組應用一個函式(無論是聚合還是轉換),通常是資料分析工作中的重要環節。在將資料集載入、融合、準備好之
資料基礎---《利用Python進行資料分析·第2版》第5章 pandas入門
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 pandas是本書後續內容的首選庫。它含有使資料清洗和分析工作變得更快更簡單的資料結構和操作工具。pandas經常和其它工