数据分析之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的平均步数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值