NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
矩阵和行列式 https://blog.csdn.net/qq_37469992/article/details/56844407
有空把3Blue1Brown 的课程刷完,线性代数—>https://www.bilibili.com/video/av6731067/?p=6
创建数组(矩阵)
数据类型
通过array创建数组
>>> numpy.array(range(10))array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> numpy.arange(1,20,3)array([ 1, 4, 7, 10, 13, 16, 19])
通过dtype属性查看数据类型
通过.astype(‘int8’)修改数据类型。
保留2位小数,与python中相同
数组的形状
两行三列的数组
通过.shape查看形状
通过reshape修改形状
>>> t = numpy.array([[1,2,3],[4,5,6]])>>> t.shape(2, 3)
一维数组转化为三行四列
(reshape不改变本身,而是返回一个改变后的值)
reshape成一个三维数组(2块,3行,4列)
一个三维数组:
修改为一维数组的两种方法 flatten 弄平的意思
>>> t = numpy.array([[1,2,3],[4,5,6]])>>> t2 = t.reshape((t.shape[0]*t.shape[1],))>>> t2array([1, 2, 3, 4, 5, 6])>>> t3 = t.flatten()>>> t3array([1, 2, 3, 4, 5, 6])
读取数据
本地数据读取
numpy.loadtxt(frame, dtype=none,delimiter=none,skiprows=0,usecols=none,unpack=False)
unpack 改为True,相当于是转置矩阵。
t = t.transpose() 或 t = t.T也是转置的效果
t = t.swapaxes(1,0) 交换轴也可以达到转置的效果,之前是(0,1)现在交换为(1,0)
取第2行 第4列的值:
t[2,4]
取到之后可以直接修改值。
取行
t = numpy.arange(24).reshape(4,6)
取第三行
t[2]
取连续多行:
t[2:]
取不连续的多行:
t[[1,3,6,7,13]]
取列
取连续的多列:
t[:,[2:8]]
取不连续的多列:
t[:,[1,2,5,7,10]]
取3行到5行,2列到4列的结果:
t[2:5,1:4]
修改值
例子1:修改t中小于15的数为10
>>> tarray([[ 0, 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10, 11],[12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23]])>>> t<15array([[ True, True, True, True, True, True],[ True, True, True, True, True, True],[ True, True, True, False, False, False],[False, False, False, False, False, False]])# 修改t中小于15的数为10>>> t[t<15] = 10>>> tarray([[10, 10, 10, 10, 10, 10],[10, 10, 10, 10, 10, 10],[10, 10, 10, 15, 16, 17],[18, 19, 20, 21, 22, 23]])
选择第2列中比50万小的每一行
例子2:修改t中小于10的数为0,大于大于等于10的为10(where 三元运算符)
>>> t = numpy.arange(24).reshape(4,6)>>> t1 = numpy.where(t<10,0,10)>>> t1array([[ 0, 0, 0, 0, 0, 0],[ 0, 0, 0, 0, 10, 10],[10, 10, 10, 10, 10, 10],[10, 10, 10, 10, 10, 10]])
又或者 使用clip
小于10的替换为10,大于18的替换为18
>>> t1 = t.clip(10,18)>>> t1array([[10, 10, 10, 10, 10, 10],[10, 10, 10, 10, 10, 11],[12, 13, 14, 15, 16, 17],[18, 18, 18, 18, 18, 18]])
替换为nan的方法:
t1 = np.arange(24).reshape(4,6).astype(‘float’)
t1[0,0] = np.nan
t[t==0]=np.nan
数组的拼接
竖直拼接 vstack
水平拼接 hstack
行或列的交换
其他常用方法zeros ones argmax argmin
构造一个全为0或全为1的数组

np.argmax(t,axis=0)
axis是维度,0就是行的方向,计算出每一行中最大的数所在的位置
>>> y = numpy.eye(3)>>> yarray([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])>>> numpy.argmax(y,axis=0)array([0, 1, 2])
生成随机数

random.randint(min,max,shape)
a = numpy.random.rand(10,20)# 生成一个列 20行的数组(值为浮点数 0到1)>>> numpy.random.randint(10,20,(4,5)) # 大于等于10 小于20array([[13, 15, 17, 17, 12],[15, 11, 17, 16, 12],[10, 12, 17, 17, 19],[14, 18, 16, 17, 12]])>>> numpy.random.uniform(10,20,(4,5)) # 小数类型array([[17.44760074, 18.28834687, 17.68752134, 13.64254043, 19.72146731],[14.92216006, 15.83619203, 15.37585188, 14.16668637, 14.19634753],[11.5405885 , 16.01012111, 13.70250036, 13.29277239, 12.55220888],[11.12925591, 11.6353873 , 15.38930101, 16.29085018, 15.33970246]])>>> a = numpy.random.normal(1,2,(4,4))# 1是对称轴(均值),2是标准差>>> aarray([[ 0.91765494, 2.14901645, -1.53539323, 0.69955653],[ 1.13330056, 2.69391375, 1.83874094, 0.86167836],[-2.21096195, 1.03397908, 1.46193918, 0.37835776],[-1.48510826, -4.54193375, -1.41579655, 4.25407471]])
NAN与无穷大
概念
注意点

np.count_nonzero(t) #判断数组中不为0的个数(nan也算不为0)
>>> a = np.ones((3,4))>>> aarray([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])>>> a[0,0] = 0>>> aarray([[0., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])>>> a/0array([[nan, inf, inf, inf],[inf, inf, inf, inf],[inf, inf, inf, inf]])>>> a/0 == a/0array([[False, True, True, True],[ True, True, True, True],[ True, True, True, True]])>>> b = a/0>>> b != barray([[ True, False, False, False],[False, False, False, False],[False, False, False, False]])>>> np.count_nonzero(b != b)# 判断nan数量1>>> np.count_nonzero(np.isnan(b))1
数组的计算
广播机制
一个数组加减乘除一个实数 相当于数组中的每一个数都进行同样的计算。
0/0=nan 代表不是一个数(但是是浮点类型),n/0=inf表示无穷。
1不能计算,2能计算(每一块和三行两列的数组进行计算)
(3,3,2)与(3,3)也可以进行计算,(3,2,3)与(3,3)也可以进行计算。
只要在某一方向上也可以进行计算
两个数组的计算
- 当两个数组形状相同时,对应位置加减乘除。
- 当两个数组行的形状是一样的(相同列数),每一行进行计算。行数相同也类似,列进行计算

- 两个数组形状有一维是一样的 那么就是可以计算的。
求和sum
1.所有数的和
>>> aarray([[0., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])>>> np.sum(a)11.0
2.求每个方向上的和 例如行方向 注意行方向是竖直向下的x轴
>>> aarray([[0., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])>>> np.sum(a,axis=0)array([2., 3., 3., 3.])
如果其中有nan,与任何值相加都是nan 所以最后还是nan,所以经常需要把nan替换成0,t``[np.isnan(t)] = 0
当然 也经常替换为均值
均值mean
也是可以指定轴的。
>>> aarray([2., 3., 3., 3.])>>> np.mean(a)2.75
其他常用 median ptp std

