随机数
如何一次生成一个随机数?用random模块
设置种子数:random.seed()
#随机生成一个整数
import random
random.seed(3)
for i in [1,2,3,4,5]:
random.seed(3)
print(random.randint(1,100))
print(random.randint(1,100))
31
76
31
76
31
76
31
76
31
76
#随机生成一个实数
random.uniform(-10,10)
#保留小数点后三位有效
round(random.uniform(-10,10),3)
如何一次生成一个“随机数组”?
用Numpy生成一个随机数组的基本步骤:
- 第一步,通过np.random.RandomState 定义一个随即变量的生成器rand
- 第二步,根据目标数组的特征(如服从均匀分布或是正态分布),选择生成器rand具体方法,如rand.randint(),rand.rand(),rand.randn()
(1)生成整数。例:生成一个3*6的矩阵,矩阵的每个元素的取值范围为[0,10]之间的整数
import numpy as np
rand=np.random.RandomState(32)#参数32为随机数种子数
x = rand.randint(0,10,(3,6)) #(3,6)为目标数组的形状
print(x)
[[7 5 6 8 3 7]
[9 3 5 9 4 1]
[3 1 2 3 8 2]]
(2)生成服从均匀分布的浮点数(实数)数组,如生成一个含有5个元素的数组
#rand.rand()返回值的取值为[0,1],“*10”的慕斯是“调整所有生成随机数的取值范围”
x = rand.rand(5)*10
print(x)
[6.76485756 6.30236437 3.56365709 0.6665021 8.90436786]
(3)生成服从正态分布的浮点数(实数)数组,如生成一个含所有5个元素且服从正太分布的数组
y = rand.randn(5)+5
y
array([4.95533055, 5.03929423, 2.50675939, 3.20330251, 4.72473022])
(4)生成等距数列,如产生一个含有20个元素的等距数列,其中每个元素的取值范围为[0,10]
x = np.linspace(0,10,20)
x
array([ 0. , 0.52631579, 1.05263158, 1.57894737, 2.10526316,
2.63157895, 3.15789474, 3.68421053, 4.21052632, 4.73684211,
5.26315789, 5.78947368, 6.31578947, 6.84210526, 7.36842105,
7.89473684, 8.42105263, 8.94736842, 9.47368421, 10. ])
数组
ndarry是python常用扩展包numpy的灵魂,代表一种特殊的数据结构——n维数组。虽然python基础功能中没有提供数组,但可以通过列表和元组实现类似数组的功能
创建数组
第一类方法:用np.arange()
myArray1 = np.arange(1,10)
myArray1
第二类方法:用np.array()
myArray2 = np.array([1,2,3,4,5])
myArray2
第三类方法:用np.zeros()、np.ones()等函数
myArray3 = np.zeros((5,5))
myArray3
myArray4 = np.ones((5,5))
myArray4
第四类方法:用np.full()创建相同元素的数组、
np.full((3,5),2)
第五类方法:用np.random生成随机数组
rand = np.random.RandomState(1)
myArrag5 = rand.randint(0,100,[3,5])
myArrag5
切片/读取
切片操作中,规则为“左包含右不包含”
python中变量名之后的[]和[[]]的区别:
一个方括号: 切片操作-------------------有规则切片:myList[1:9:3]
嵌套的两个方括号[[]]: Fancy Indexing ----------不规则切片:myList[[1,2,4]]
浅拷贝和深拷贝
浅拷贝:复制过来的是“引用”,即“复制对象和被复制对象共享一个存储空间,二者并不是相互独立的”
import numpy as np
myArray1 = np.array(range(0,10))
myArray2 = myArray1
myArray2[1] = 100#此处修改了myArray2的取值
myArray1
array([ 0, 100, 2, 3, 4, 5, 6, 7, 8, 9])
深拷贝:复制过来的是“值”,即“复制对象和被复制对象占用两个不同空间,二者是相互独立的”
深拷贝的方法:copy()
import numpy as np
myArray1 = np.array(range(0,10))
myArray2 = myArray1.copy()
myArray2[1] = 100#此处修改了myArray2的取值
myArray1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
形状与重构
重构的含义为“返回一个符合新形状要求的数组”
(1)用方法reshape(),返回一个新的数组
输入:
MyArray6 = MyArray5.reshape(5,4)
MyArray6
输出
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20]])
输入
MyArray5.shape
输出
(20,)
输入
MyArray5
输出
MyArray5
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20])
(2)用resize()方法更改数组本身的形状,即“就地修改”
MyArray5.resize(4,5)
MyArray5
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
(3)用swapaxes()方法进行轴交换,如时间矩阵转置
MyArray5.swapaxes(0,1)
array([[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19],
[ 5, 10, 15, 20]])
MyArray5
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
(4)用flatten()方法将多维数组转成一维数组
MyArray5.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20])
(5)用tolist()方法将多维数组转换为嵌套列表
MyArray5.tolist()
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
(6)可以重设数组元素的数据类型
MyArray5.astype(np.float)
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[11., 12., 13., 14., 15.],
[16., 17., 18., 19., 20.]])
ndarray的计算
- 横向拆分--------------split()方法
输入
x = np.array([11,12,13,14,15,16,17,18])
x1,x2,x3 = np.split(x,[2,4])
print(x1,x2,x3)
输出
[11 12] [13 14] [15 16 17 18]