import numpy as np
np.__version__
'1.15.2'
为什么要使用numpy? Python list 的特点
L = [i for i in range(10)]
L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[5]
5
L[5] = 100
L
[0, 1, 2, 3, 4, 100, 6, 7, 8, 9]
L[5] = 'Data Analysis'
L
[0, 1, 2, 3, 4, 'Data Analysis', 6, 7, 8, 9]
python中的list 是不对存储类型做约束, 优点 灵活 缺点 性能 因为要检查每个元素的类型 python 中也有专门存储一种数据的数组
import array
arr = array.array('i', [i for i in range(10)])
# 'i'表示整型
arr
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
arr[5] = 100
arr
array('i', [0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
type(arr)
array.array
# arr[5] = 'Data Analysis'
TypeError Traceback (most recent call last)
----> 1 arr[5] = 'Data Analysis'
TypeError: an integer is required (got type str)
优点 :效率高 缺点 :只能存储一种类型,当做一个二维数组 没有看做向量 或者矩阵 没有配备相应的运算
由此numpy应运而生
nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr[5]
5
# 修改值
nparr[5] = 100
nparr
array([0,1,2,3,4, 100,6,7,8,9])
# 同样会报错 只能存一种类型
#nparr[5] = 'Data Analysis'
# 特殊方法
nparr.dtype
dtype('int64')
nparr[5] = 3.14
nparr
array([0, 1, 2, 3, 4, 3, 6, 7, 8, 9])
# 进行了一次隐式转换 进行截位
nparr.dtype
dtype('int64')
# 我们大多数在机器学习和数据分析创建的类型都是浮点数
# 第二种创建 numpy 的方式
nparr2= np.array([1, 2, 3.0])
nparr2
array([1., 2., 3.])
nparr2.dtype
dtype('float64')
其他创建 numpy.array 的方法
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros(10).dtype
dtype('float64')
np.zeros(10, dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
- 传入元组参数
np.zeros((3, 5))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
- 3 x 5 的全零矩阵
np.zeros(shape=(3, 5), dtype=int)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3, 5))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
# 全都是指定值的矩阵
np.full((3, 5), 666)
array([[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666]])
# 上面显示参数的写法fill_value=https://www.it610.com/article/666和fill_value=666.0 可以决定类型
np.full(shape=(3, 5),fill_value=666)
array([[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666]])
传参写不写 变量名 方便他人阅读 传两个以上的参数建议写
arange函数 相当于py 的range()
- 左闭右开 步长
# python中range()的用法
[i for i in range(0, 20, 2)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
np.arange(0, 20, 2)
array([ 0,2,4,6,8, 10, 12, 14, 16, 18])
# [i for i in range(0, 1, 0.2)]
# 报下面的错误 不能传入浮点数TypeError: 'float' object cannot be interpreted as an integer
但是arange的步长可以是浮点数
np.arange(0, 1, 0.2)
array([0. , 0.2, 0.4, 0.6, 0.8])
# 默认步长为1
np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 省略起始点
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
[i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numpy中还有一个和arange()像的函数
linspace
# 包括[0,20]的等长的十个点 (9个间距)形成等差数列
np.linspace(0, 20, 10)
array([ 0.,2.22222222,4.44444444,6.66666667,8.88888889,
11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.])
# 要形成以2位=为步长11 个点(10个间距)
np.linspace(0, 20, 11)
array([ 0.,2.,4.,6.,8., 10., 12., 14., 16., 18., 20.])
随机数 random
- randin
np.random.randint(0, 10)# [0, 10)之间的随机数
5
- 生成一维数组 向量 第三个参数是数组个数
np.random.randint(0, 10, 10)
array([9, 8, 4, 1, 8, 0, 7, 9, 1, 6])
左闭右开
# 验证左闭右开
np.random.randint(0, 1, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# size=10标识方便阅读
np.random.randint(4, 8, size=10)
array([6, 6, 4, 4, 4, 5, 5, 5, 6, 5])
# 生成3 x 5 矩阵
np.random.randint(0, 10, size=(3,5))
array([[9, 6, 4, 4, 2],
[6, 9, 5, 1, 9],
[7, 7, 5, 3, 6]])
之后我们要经常使用随机矩阵,那么随机性使得每次结果不一样,计算机中的数字都是伪随机的,靠随机数生成算法
推动这个算法生成的随机数都会有一个随机种子 ,我们可以显示指定
seed函数
np.random.seed(666)
np.random.randint(0, 10, size=(3, 5))
array([[4, 4, 0, 0, 4],
[0, 4, 5, 7, 1],
[0, 0, 6, 6, 0]])
np.random.seed(666)
np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3],
[1, 0, 8, 7, 5],
[2, 5, 5, 4, 8]])
# 总结 seed666一致
random 随机浮点数
# 生成[0,1)之间的随机浮点数
np.random.random()
0.2683298107038842
# 可以显示的指定 size=10
np.random.random(10)
array([0.63279787, 0.18935861, 0.1308497 , 0.75765845, 0.34158167,
0.52138487, 0.88302327, 0.44914216, 0.23902229, 0.33014086])
np.random.random((3,5))
array([[0.26650938, 0.79768204, 0.05551712, 0.12980746, 0.82262638],
[0.36076783, 0.56970121, 0.83023273, 0.44767601, 0.2132831 ],
[0.56115445, 0.71657783, 0.7493205 , 0.58624783, 0.54759891]])
以上是 0 ~ 1之间均匀的浮点数
- 有的时候需要正太分布的随机数
- 均值为0 方差 为1 的随机浮点数
# 均值为0 方差 为1 的随机浮点数
np.random.normal()
-0.16835626126560016
均值为10 方差 为100
np.random.normal(10, 100)
-66.97676239131684
# 均值为0 方差 为1 3x5矩阵(size)
np.random.normal(0, 1, (3, 5))
array([[-0.76477299,0.10761758,0.29765915, -0.20175624,0.19436849],
[-0.43672616, -0.81171323, -1.46103885, -1.04532478, -1.38852421],
[ 2.41334827,0.59300083,0.62047343,0.47576512,0.86748134]])
np.random.normal?
# 在notebook里面查看
help(np.random.normal)
05 numpy.array 基本操作
import numpy as np
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# reshape 一维转化为 二维 3x5
X = np.arange(15).reshape((3, 5))
X
array([[ 0,1,2,3,4],
[ 5,6,7,8,9],
[10, 11, 12, 13, 14]])
基本属性
- 查看数组维度
x.ndim
1
X.ndim
2
- shape属性 返回元组 x为一维
x.shape# 数组的样子
(10,)
X.shape
(3, 5)
元素个数
x.size
10
X.size
15
numpy.array 的数据访问
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[0]
0
x[-1]
9
X
array([[ 0,1,2,3,4],
[ 5,6,7,8,9],
[10, 11, 12, 13, 14]])
X[0][0] # 不建议!
0
X[(0,0)]
0
X[0, 0]
0
X[0, -1]
4
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[0:5]
array([0, 1, 2, 3, 4])
x[:5]
array([0, 1, 2, 3, 4])
x[5:]
array([5, 6, 7, 8, 9])
x[4:7]
array([4, 5, 6])
- 步长
x[::2]
array([0, 2, 4, 6, 8])
x[1::2]
array([1, 3, 5, 7, 9])
x[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
X
array([[ 0,1,2,3,4],
[ 5,6,7,8,9],
[10, 11, 12, 13, 14]])
- 数组切片
X[:2, :3]
array([[0, 1, 2],
[5, 6, 7]])
X[:2][:3] # 结果不一样,在numpy中使用","做多维索引
#
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
X[:2]
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
X[:2][:3]#是在上面的基础上进行切片 但数组中只有2个元素(实际是[:3]代表取三个)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
X[:2, ::2]
array([[0, 2, 4],
[5, 7, 9]])
X[::-1, ::-1]#矩阵反转
array([[14, 13, 12, 11, 10],
[ 9,8,7,6,5],
[ 4,3,2,1,0]])
X[0, :] #降低唯独变成一维度向量
array([0, 1, 2, 3, 4])
X[0, :].ndim
1
X[:, 0]
array([ 0,5, 10])
以上切片获取了X 的子矩阵,子数组和python中的list有很大区别
Subarray of numpy.array
subX = X[:2, :3]
subX
array([[0, 1, 2],
[5, 6, 7]])
subX[0, 0] = 100
subX
array([[100,1,2],
[5,6,7]])
- 但是元=原矩阵X到底有没有变呢 不像list那样会创建新的矩阵,会影响X
X
array([[100,1,2,3,4],
[5,6,7,8,9],
[ 10,11,12,13,14]])
X[0, 0] = 0
X
array([[ 0,1,2,3,4],
[ 5,6,7,8,9],
[10, 11, 12, 13, 14]])
创建的subX和原矩阵无关的副本
subX = X[:2, :3].copy()
subX[0, 0] = 100
subX
array([[100,1,2],
[5,6,7]])
X
array([[ 0,1,2,3,4],
[ 5,6,7,8,9],
[10, 11, 12, 13, 14]])
Reshape
x.shape
(10,)
x.ndim
1
x.reshape(2, 5)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
A = x.reshape(2, 5)
A
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
B = x.reshape(1, 10)
B
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
B.ndim
2
B.shape
(1, 10)
x.reshape(-1, 10)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x.reshape(10, -1)
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
x.reshape(2, -1)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#x.reshape(3, -1)
报错
ValueError Traceback (most recent call last)
----> 1 x.reshape(3, -1)
【Numpy最终版】ValueError: cannot reshape array of size 10 into shape (3,newaxis)