基础
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.youkuaiyun.com/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.youkuaiyun.com/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的平均步数