接着上一部分
# 开头我就在说numpy是python 的一个科学计算包,具体体现在哪呢?
# 用下面的例子看一下
a = [[1, 2, 3], [5, 7, 8], [4, 5, 6]]
b = [[6, 2, 1], [2, 3, 1], [4, 5, 6]]
# 需求;比如我想把上边的a,b相加怎样做
# 第一种做法:python 原生态做法
# 我们现根据列表的形状,创建一个空数组用于接收结果
c=[[0,0,0],[0,0,0],[0,0,0]]
for i in range(3):
for j in range(3):
c[i][j]=a[i][j]+b[i][j]
print(c)
[[7, 4, 4], [7, 10, 9], [8, 10, 12]]
# 第二种做法:
a1=np.array(a)
a2=np.array(b)
c1=a1+a2
print(c)
c1 # 这个时候还是数组
c2=c1.tolist() # 数组转换为列表
c2
# 对比两种做法,numpy 更加块,更加简洁
[[7, 4, 4], [7, 10, 9], [8, 10, 12]]
[[7, 4, 4], [7, 10, 9], [8, 10, 12]]
# Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下
print(a1-a2)
print(a1*a2)
print(a1/a2)
print(a1//a2)
# 数组之间的运算,
# 第一种情况是,两个数组的形状相同,对应位置相加,减,乘除,求余
# 第二种情况要是形状不相同呢?
# 先看一个例子
a1=np.arange(3)
b1=np.ones((3,3)) # 先不用了解ones,这个主要看原理
c1=np.ones((3,1))
print(a1+5)
print()
print(b1+a1)
print()
print(a1+c1)
# 我们可以看到,数组a1,每个元素都+5,这是为什么呢,这个时候就有一个广播机制
# 广播机制:当把一个低维和一个高维数据进行计算时,会自动将低维数据拉伸到和高维相同的形状,然后进行对应元素位置操作
# 其他运算
a1=np.arange(3)
b1=np.ones((3,3))
c1=np.ones((3,1))
print(a1,b1,c1)
print()
print(a1**2) # 平方
print(np.sqrt(a1)) # 开方
print(np.exp(a1)) # 指数
print(np.log(a1)) # 对数
# 常用的简单的运算函数
ar=np.arange(3)
print(ar.mean()) # 求平均值
print(ar.max()) # 求最大值
print(ar.min()) # 求最小值
print(ar.std()) # 求标准差
print(ar.var()) # 求方差
print(ar.sum()) # 求和
1.0
2
0
0.816496580927726
0.6666666666666666
3
小练习
一家连锁店,A门店最近5天的营业额数据为: 1200,1398,2200,1100,1521
B门店5天营业额为: 1340,1211,1460,1121,1609
计算连锁店每天的总收入
计算连锁店5天的总收入
计算A店和B店的销售额的对数差
(不做)计算A店和B店每天销售量更高的是哪个店?
创建常用数组
### 创建一个全0数组,默认float型
# 语法:np.ones(shape,dtype) shape:形状
a1=np.ones(1) # 一维的
a2=np.ones((1,1)) # 二维以上写(),[]都可以,shape的第一个参数可以理解为几行,第二个参数为几列
a3=np.ones([1,2])
print(a1,a2,a3,sep="\n")
print()
a4=np.ones((2,3,4))
print(a4)
# 三维理解:
# 第一个数2:三维中有2个二维平面构成三维体
# 3:每个二维元素由3个一维元素组成
# 4 :每个一维元素由4个0位元素组成
a5=np.ones_like(a4)
print(a5)
# 返回具有与给定数组相同的形状和类型的零数组
# 创建一个全是1的数组,跟ones 一模一样
# 语法:np.zeros(shape,dtype) ,默认输出也是float型的,也可以指定类型,不说
a1=np.zeros(1) # 一维的
a2=np.zeros((1,1))
a3=np.zeros([1,2])
print(a1,a2,a3,sep="\n")
print()
a4=np.zeros((2,3,4))
print(a4)
print()
a5=np.zeros_like(a4)
print(a5)
# 创建单位矩阵
# np.eye(n,m,k) n:行,m:列,k:偏移量,m=n 可以不用写
# 创建一个单位矩阵,对角线值为1,其余为0
a=np.eye(5) # 只有一个参数时,#创建一个正方的N*N的单位矩阵,对角线值为1,其余为0
a1=np.eye(4,3) # 这个跟ones,zeros,创建数组形状不一样
print(a,a1,sep="\n")
print()
a2=np.eye(4,4,-1) # k<0:代表对角线向下移,>0 :代表向上移
print(a2)
# 创建等差数组
# 语法:linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):返回在间隔上计算的num个均匀间隔的样本。默认返回float
# start:起始值,stop:结束值
# num:生成样本数,默认为50
# endpoint:如果为真,则停止是最后一个样本。否则,不包括在内。默认值为True。
# retstep:如果为真,返回(样本,步长),其中步长是样本之间的间距 → 输出为一个包含2个元素的元祖,第一个元素为array,第二个为步长实际值
print(np.linspace(1,10,4) )#
print()
print(np.linspace(1,10,4,endpoint=False))
print(np.linspace(1,10,4,retstep=True))
[ 1. 4. 7. 10.]
[1. 3.25 5.5 7.75]
(array([ 1., 4., 7., 10.]), 3.0)
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#choice 从一维数组中生成随机数
# 第一参数是一个1维数组,如果只有一个数字那就看成range(5)
# 第二参数是维度和元素个数,一个数字是1维,数字是几就是几个元素
# 比如:a = np.random.choice(5,3) print(f'从range(5)中拿随机数,生成只有3个元素的一维数组是:{a}')
arr1=np.random.choice(5,3)
arr1
arr2=np.random.choice(6,(2,3))
arr2
arr3=np.random.choice([1,2,77,55],2)
arr3
arr2
np.random.shuffle(arr2) # 打乱顺序
arr2
### 小练习:
1. 生成一个6行6列的单位矩阵数组,数据类型为字符串
2. 生成一个(2,3,4)的数组,并使用无穷大进行填充
3. 生成5,15的随机整数数组,形状为(3,6)
4. 生成3行4列的标准正态分布数组
5. 生成均值为10,标准差为5的(7,3)的正太分布
6. 生成从12到22,步长为2的序列
7. 生成从12到22的序列,序列的长度为100个
继续