千锋教育NumPy教程,保姆级基础入门Python数据分析_哔哩哔哩_bilibili
目录
1.numpy的导入
2.numpy的数组创建
3.numpy的常用属性
4.numpy的索引和切片
5.numpy的数组变形、合并、拆分
6.numpy的赋值和深拷贝
7.numpy的聚合
7.numpy的矩阵操作(矩阵,广播,其他)
8.numpy的数组快速排序
9.numpy的文件操作
10.numpy的练习
10.1 创建一个长度为10的一维全部为0 的ndarray对象,然后让第5个元素等于1
10.2 创建一个元素为10到49的ndarray对象
10.3 将第2题的所有元素位置反转
10.4 使用np.random.random创建一个10*10的ndarray对象,并且打印出最大最小元素
10.5 创建一个10*10的ndarray对象,且矩阵边界都是1,里边全是0
10.6 创建一个每一行都是从0到4的5*5矩阵
10.7 创建一个范围在(0,1)之间的长度为12的等差数列
10.8 创建一个长度为10的随机数组并且排序
10.9 创建一个长度为10 的随机数组并且将最大值替换成0
10.10 给定一个4维矩阵,如何得到最后两维的和?
10.11 给定数组[1,2,3,4,5],如何得到这个数组的每个元素之间插入3个0后的新数组?
10.12 给定一个二维矩阵,如何交换其中两行的元素
10.13 创建一个100000长度的随机数组,使用两种方法对其求三次方,并且比较使用的时间
10.14 创建一个5*3 的随机矩阵和一个3*2的随机矩阵,求矩阵的积
10.15 矩阵的每一行的元素都减去该行的平均值
10.16 打印出一下矩阵(要求使用np.zeros创建8*8的矩阵)
10.17 正则化一个5*5的随机矩阵
正则的概念:假设a是矩阵中的一个元素,max/min分别是矩阵的元素的最大值与最小值,则正则化后a = (a - min) /(max - min)
1.numpy的导入
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
cat = plt.imread('cat.jpg') # 读取图片数据
# print('cat:', cat, '\n') # 图片由数字组成,三维数组(0-255--->>rgb)
print('type(cat):', type(cat), '\n') # nd-->>多维 array-->>数组
print('cat.shape:', cat.shape, '\n') # 查看维度,三个数字代表三个维度,421行,725列,3代表RGB颜色的数值
# 显示图片
plt.imshow(cat) # 三维彩色,二维黑白
plt.show()
# 视频:四维数据(x,421,725,3), x:帧数
![](https://img-blog.csdnimg.cn/cc9fe12d5f234dbc800180fbd897680c.png)
2.numpy的数组创建
1 | 使用np.array() 由python list |
l = [1, 4, 2, 3, 5, 6]
n = np.array(l)
print("n:", n, '\n')
print("type(n):", type(n), '\n') # 类型
print("n.shape:", n.shape, '\n') # 维度
# -----类型------
n = np.array([3.14, 2])
![](https://img-blog.csdnimg.cn/447c4f68f2cd4c78aa8cdaf76299f0a3.jpeg)
2 | 使用np.ones(shape, dtype=None, order='C') |
1 | 所有元素都为1 |
2 | shape:形状 |
3 | dtype:None: 元素类型 |
4 | order:{'C', 'F'},可选,默认值:C是否在内存中以行主(C-风格)或列主(Fortran-风格)顺序存储多维数据,一般默认就行 |
n = np.ones(shape=(3, 4), dtype=np.int16)
print("n:", n, '\n')
3 | 使用np.zeros(shape, dtype=float) |
1 | 所有元素都为0 |
2 | shape:形状 |
3 | dtype:None: 元素类型 |
n = np.zeros(shape=(3, 4), dtype=np.int16)
print("n:", n, '\n')
4 | 使用np.full(shape,fill_value, dtype=float, order='C') |
1 | 所有元素都为填充值 |
2 | shape:形状 |
3 | dtype:None: 元素类型 |
4 | fill_value: 填充值 |
5 | order:{'C', 'F'},可选,默认值:C是否在内存中以行主(C-风格)或列主(Fortran-风格)顺序存储多维数据,一般默认就行 |
n = np.full(shape=(3, 4), fill_value=8, dtype=np.int16)
print("n:", n, '\n')
5 | 使用np.eye(N, M=None, k=0, dtype=float) |
1 | 对角线为1,其他位置为0 |
2 | N:行 |
3 | M:列数,默认为None,表示行列一样 |
4 | k: 向右偏移0个位置 |
5 | dtype:None: 元素类型 |
n = np.eye(3, 4, k=1, dtype=np.int8) # 单位矩阵, 一般不偏移
print("n:", n, '\n')
6 | 使用np.linspace(start, stop, num=50, endpoint=Ture, restep=Flase, dtype=None) |
1 | 等差数列 |
2 | start:开始 |
3 | stop:结束 |
4 | num:等差数列中有50个数字,默认50 |
5 | endpoint: 是否包含结束值 |
6 | restep:是否返回等差值(步长) |
7 | dtype:None: 元素类型 |
n = np.linspace(0, 100, num=51, retstep=True, dtype=np.int8) # 单位矩阵, 一般不偏移
print("n:", n, '\n')
7 | 使用np.arange(start, stop, step, dtype=None) |
1 | 创建一个数值范围的数组,和range功能类似, [start,stop) |
2 | start:开始 |
3 | stop:结束 |
4 | step:步长 |
5 | dtype:None: 元素类型 |
n1 = np.arange(10) # 0-9
print("n1:", n1, '\n')
n2 = np.arange(2, 10, 2) # 2,4,6,8
print("n2:", n2, '\n')
8 | 使用np.random.randint(low, high=None, size=None, dtype=None) |
1 | 创建一个随机整数数组 |
2 | low:最小值 |
3 | high=None:最大值
high=None时, 生成的数据在[0,low)区间内
如果使用high,生成的数据在[low,high)区间内 |
4 | size=None:数组形状,默认只输出一个随机值 |
5 | dtype:None: 元素类型 |
n1 = np.random.randint(10) # 0-9中随机一个数字
print("n1:", n1, '\n')
n2 = np.random.randint(3, 10, size=(3, 4)) # 二维数组
print("n2:", n2, '\n')
n3 = np.random.randint(0, 256, size=(20, 40, 3)) # 三维数组
plt.imshow(n3)
plt.show()
![](https://img-blog.csdnimg.cn/e75f8c334d5b4b35b4f531f69fb501f1.png)
9 | 使用np.random.randn(d0,d1,....,dn) |
1 | 服从一个标准正态分布的多维数组,0是均值,1是标准差的正态分布 |
2 | dn:第n个维度的数值 |
n1 = np.random.randn() # 产生一个数
print("n1:", n1, '\n')
n2 = np.random.randn(10) # 产生十个个数
print("n2:", n2, '\n')
n3 = np.random.randn(3, 4)
print("n3:", n3, '\n')
10 | 使用np.random.normal(loc=0.0, scale=1.0, size=None) |
1 | 服从一个正态分布的多维数组 |
2 | loc:平均值 |
3 | scale:标准差,越大曲线越矮,越小曲线越高 |
4 | size=None:数组形状 |
n1 = np.random.normal() # 产生一个数
print("n1:", n1, '\n')
n2 = np.random.normal(loc=100, scale=10, size=(3, 4))
print("n2:", n2, '\n')
11 | 使用np.random.random(size=None) |
1 | [0,1)的随机数的多维数组 |
2 | size=None:数组形状 |
n1 = np.random.random() # 产生一个数
print("n1:", n1, '\n')
n2 = np.random.random(size=(3, 4))
print("n2:", n2, '\n')
12 | 使用np.random.rand(d0,d1,....,dn) |
1 | [0,1)的随机数的多维数组,与np.random.random功能类似 |
2 | dn:n个维度 |
n1 = np.random.rand() # 产生一个数
print("n1:", n1, '\n')
n2 = np.random.rand(3, 4)
print("n2:", n2, '\n')
3.numpy的常用属性
1 | .ndim
| 维度,3代表三维 |
2 | .shape | 形状(各维度的长度),有三个数字代表三维 |
3 | .size | 915675,总的数据量,总的个数 |
4 | .dtype | 类型,unit8 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
cat = plt.imread('cat.jpg')
print('cat.ndim:', cat.ndim, '\n') # 维度,3代表三维
print('cat.shape:', cat.shape, '\n') # 形状(各维度的长度),有三个数字代表三维
print('cat.size:', cat.size, '\n') # 915675,总的数据量,总的个数
print('cat.dtype:', cat.dtype, '\n') # 类型,unit8
4.numpy的索引和切片
numpy的索引
一维 | n[0] | 第一个 |
n[-1] | 最后一个 |
二维 | n1[3][4] / n1[3, 4] | 第四行,第五列 |
n1[-1][-1] | 最后一行,最后一列 |
三维 | n2[1][2][-1] n2[1, 2, -1] | |
n2[1, 2, -1] = 886 | 改变指定数字 |
n2[1, 2] = 100 | |
mport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
1.一维
'''
l = [1, 2, 3, 4]
print('l[0]:', l[0], '\n')
n = np.array(l)
print('n[0]:', n[0], '\n')
print('n[-1]:', n[-1], '\n') # 一维和列表差不多
'''
2.二维
'''
n1 = np.random.randint(0, 10, size=(4, 5))
print('n1:', n1, '\n')
# 找到最后一个数字’
print('n1[3][4]:', n1[3][4], '\n') # 和下边一样的
print('n1[-1][-1]:', n1[-1][-1], '\n') # 先行后列
print('n1[3, 4]:', n1[3, 4], '\n') # 和上边一样的
'''
3.三维
'''
n2 = np.random.randint(0, 100, size=(4, 5, 6))
print('n2:', n2, '\n')
#
print('n2[1][2][-1]:', n2[1][2][-1], '\n') # 三个数字按照上边的三个维度的顺序来
print('n2[1, 2, -1]:', n2[1, 2, -1], '\n')
n2[1, 2, -1] = 886 # 改变指定数据
print('n2:', n2, '\n')
n2[1, 2] = 100 # 也可以一个一个指定[1,2,3,4,5,6]
print('n2:', n2, '\n')
numpy的切片
一维 | n[2:6] | |
n[::-1] | 翻转 |
二维 | n1[0] | 第一行 |
n1[1:4] | 二到四行 |
n1[[1, 2, 4]] | 不连续的三行 |
n1[:,0] | 第一列 |
n1[:,1:4] | 二到四列 |
n1[:, [1, 2, 4]] | 不连续的三列 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
1.一维
'''
# 一维与列表完全一致
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('l[2:6]:', l[2:6], '\n') # [3, 4, 5, 6]
print('l[::-1]:', l[::-1], '\n') # 列表翻转,[9, 8, 7, 6, 5, 4, 3, 2, 1]
n = np.array(l)
print('n:', n, '\n')
print('n[2:6]:', n[2:6], '\n') # [3, 4, 5, 6]
print('n[::-1]:', n[::-1], '\n') # 列表翻转,[9, 8, 7, 6, 5, 4, 3, 2, 1]
'''
2.二维
'''
n1 = np.random.randint(0, 10, size=(6, 8))
print('n1:', n1, '\n')
# 行
print('n1[0]:', n1[0], '\n') # 取第一行
print('n1[1:4]:', n1[1:4], '\n') # 取二到四行
print('n1[[1, 2, 4]]:\n', n1[[1, 2, 4]], '\n') # 取不连续的三行,也可以重复取
# 列
n2 = np.random.randint(0, 10, size=(6, 8))
print('n2:', n2, '\n')
print('n1[:,0]:', n1[:, 0], '\n') # 取第一列
print('n1[:,1:4]:', n1[:, 1:4], '\n') # 取二到四列
print('n1[:, [1, 2, 4]]:\n', n1[:, [1, 2, 4]], '\n') # 取不连续的三列,也可以重复取
图片的变形
图片上下翻转 | cat[::-1] |
图片左右翻转 | cat[:, ::-1] |
图片颜色翻转 | cat[:, :, ::-1] RGB-->>BGR |
图片模糊处理 | cat[::10, ::10, ::-1] |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 图片的翻转
n = np.random.randint(0, 100, size=(5, 6))
# 行翻转
print('n:\n', n, '\n')
print('n[::-1]:\n', n[::-1], '\n') # 行翻转
# 列翻转
print('n[:, ::-1]:\n', n[:, ::-1], '\n') # 列翻转
cat = plt.imread('cat.jpg')
print('cat.shape:\n', cat.shape, '\n')
# plt.imshow(cat)
# plt.show()
# plt.imshow(cat[::-1]) # 图片上下翻转
# plt.show()
# plt.imshow(cat[:, ::-1]) # 图片左右翻转
# plt.show()
# 对颜色翻转:RGB-->>BGR
# plt.imshow(cat[:, :, ::-1]) # 图片左右翻转
# plt.show()
# plt.imshow(cat[::10, ::10, ::-1]) # ::10 -->> 每隔10个取一个
# plt.show() # 模糊处理
![](https://img-blog.csdnimg.cn/16143001fc4f4a0fb526c2b2713d7da0.png)
![](https://img-blog.csdnimg.cn/faf145cca0fb4aedb929cf08e92e7701.png)
![](https://img-blog.csdnimg.cn/f7d8c0213c454dbe8dd8d39ffd5b600d.png)
5.numpy的数组变形、合并、拆分
reshape:改变数组形状
np.reshape | np.reshape(n, (4, 5)) | 变成4行5列 |
n2.reshape(-1) | 变成一行 |
n2.reshape(-1, 1) | 变成一列 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
reshape:改变数组形状
'''
n = np.arange(1, 21)
n2 = np.reshape(n, (4, 5))
print('n:\n', n, '\n') # [1,...,20]
print('n.shape:\n', n.shape, '\n') # (20,)
print('n2:\n', n2, '\n') # 变成4行5列的数组
print('n2.shape:\n', n2.shape, '\n') # (4, 5)
n2 = n2.reshape(5, 4)
print('n2.shape:\n', n2.shape, '\n') # (5, 4)
n2 = n2.reshape(-1) # 变成一个维度
print('n2.shape:\n', n2.shape, '\n') # (20,)
# 使用-1表示任意剩余维度长度
n2 = n2.reshape(4, -1)
print('n2.shape:\n', n2.shape, '\n') # (4, 5)
n2 = n2.reshape(-1, 1)
print('n2:\n', n2, '\n') # 变成多行一列
n2 = n2.reshape(2, -1, 2)
print('n2:\n', n2, '\n') # 变成三维
合并
np.concatenate | np.concatenate((n1, n2), axis=0) | 上下合并(默认) |
np.concatenate((n1, n2), axis=1) | 左右合并 |
np.hstack | np.hstack((n1, n2)) | 水平合并 |
np.vstack | np.vstack((n1, n2)) | 上下合并 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
np.concatenate()
参数是列表或者元组
级联的数组维度必须相同
可通过axis参数改变级联的方向
'''
n1 = np.random.randint(0, 100, size=(3, 5))
n2 = np.random.randint(0, 100, size=(3, 5))
print(n1, '\n\n', n2, '\n')
np.concatenate((n1, n2))
print(np.concatenate((n1, n2)), '\n\n') # 默认上下合并
np.concatenate((n1, n2), axis=0) # 上下合并axis=0表示第一个维度(行)
np.concatenate((n1, n2), axis=1) # 左右合并axis=1表示第一个维度(列)
print(np.concatenate((n1, n2), axis=1), '\n\n') # 默认上下合并
'''
np.hstack()与np.vstack
水平级联(左右合并)与垂直级联(上下合并)
'''
np.hstack((n1, n2))
print(np.hstack((n1, n2)), '\n') # 水平合并
np.vstack((n1, n2))
print(np.vstack((n1, n2)), '\n') # 上下合并
拆分
np.vsplit | np.vsplit(n, 3) | 垂直拆分 |
np.vsplit(n, (1, 2, 4)) | 拆分到第几行 按照指定位置拆分 |
np.hsplit | np.hsplit(n, 2) | 水平拆分 |
np.split | np.split(n, 2, axis=0) | 默认水平拆分 |
np.split(n, 2, axis=1) | 按照列进行拆分 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
'''
np.split(axis控制--->> 0行,1列)
np.vsplit
np.hsplit
'''
n = np.random.randint(0, 100, size=(6, 4))
print(n, '\n')
print(np.vsplit(n, 3), '\n') # 垂直拆分,平均分成三份
print(np.vsplit(n, (1, 2, 4)), '\n') # 拆分到第几行,按照指定位置拆分
print(np.hsplit(n, 2), '\n') # 水平拆分,平均分成两份
print(np.split(n, 2, axis=0), '\n') # 默认水平拆分
print(np.split(n, 2, axis=1), '\n') # 按照列进行拆分
cat = plt.imread('cat.jpg')
cat2 = cat[:-1] # 到最后一个行(420),但是不包含
# plt.imshow(cat2)
# plt.show()
cat3 = np.split(cat2, 2)
# plt.imshow(cat3[0]) # 上半部分
# plt.show()
# plt.imshow(cat3[1]) # 下半部分
# plt.show()
cat4 = np.split(cat2, 5, axis=1)
plt.imshow(cat4[0]) # 水平拆分
plt.show()
![](https://img-blog.csdnimg.cn/06f497bba9674483b14fc0e89503b4c3.png)
![](https://img-blog.csdnimg.cn/635ec13435ba45f1b0852dcdedae6c60.png)
![](https://img-blog.csdnimg.cn/96c7849b768945da81118f25e881059b.png)
![](https://img-blog.csdnimg.cn/24892a0b0be24211bc1da300c63aa715.png)
6.numpy的赋值和深拷贝
赋值(=) | 同一个内存,该任何一个,俩个都改变 |
深拷贝(.copy()) | 不是同一个内存,后改变的数值,不影响前边的数值 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# '''
# 1. 赋值:用的是同一个内存
# '''
# n = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# print(n)
# n2 = n
# n2[0] = 100
# print('\n', n, '\n', n2) # n2 = n = [100 1 2 3 4 5 6 7 8 9]
#
# '''
# 2. 拷贝:.copy()-->>深拷贝
# '''
# n1 = np.arange(10)
# n3 = n1.copy()
# n3[0] = 100
# print('\n', n1, '\n', n3)
# # n3 = [100 1 2 3 4 5 6 7 8 9]
# # n1 = [0 1 2 3 4 5 6 7 8 9]
n = np.random.randint(0, 10, size=(2, 3))
n2 = n.copy()
n2[0, 0] = 100
print(n2)
7.numpy的聚合
1 | np.sum(n,axis=None) | 求和 |
2 | np.nansum | nan:空值 ps:排除空值求和 |
3 | np.min | 最小值 |
4 | np.max | 最大值 |
5 | np.mean(用的多) | 平均值 |
6 | np.average | 平均值 |
7 | np.median | 中位数 |
8 | np.percentile | 百分位数 |
9 | np.argmin | 第一个最小值对应的下标 |
10 | np.argmax | 第一个最大值对应的下标 |
11 | np.std | 标准差 |
12 | np.var | 方差 |
13 | np.power | 次方,求幂 |
14 | np.argwhere | 按条件查找 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n = np.arange(10)
n1 = np.random.randint(0, 10, size=(3, 5))
print('np.sum(n):\n', np.sum(n), '\n') # 45
print('np.sum(n1):\n', np.sum(n1), '\n') # 82
print('np.sum(n1):\n', np.sum(n1, axis=1), '\n') # axis=0:每一列的多行求和
print('np.max(n1):\n', np.max(n1), '\n')
print('np.min(n1):\n', np.min(n1), '\n')
print('np.mean(n1):\n', np.mean(n1), '\n')
print('np.average(n1):\n', np.average(n1), '\n')
print('np.median(n1):\n', np.median(n1), '\n')
print('np.percentile(n1):\n', np.percentile(n1, q=50), '\n') # 百分位数,表示中位数
n1 = n1.reshape(-1)
print(n1)
print('np.argmax(n1):\n', np.argmax(n1), '\n') # 第一个最大值对应的下标
print('np.argwhere(n1):\n', np.argwhere(n1 == np.max(n1)), '\n') # 按照条件找到所有最大值的下标
print('np.power(n1):\n', np.power(n1, 2), '\n') # 等于n ** 2
print('np.std(n1):\n', np.std(n1), '\n')
print('np.var(n1):\n', np.var(n1), '\n')
n2 = np.array([1, 2, 3, np.nan])
print('n2:', n2)
print('np.sum(n2):\n', np.sum(n2), '\n') # nan
print('np.nansum(n2):\n', np.nansum(n2), '\n') # 6.0
7.numpy的矩阵操作(矩阵,广播,其他)
矩阵操作
一、矩阵基本操作 |
加减乘除 整除 次方 求余数 (这里是每个数字) | 加法(n + 10) |
减法(n - 10) |
乘法(n + 10) |
除法(n / 10) |
整除(n // 10) |
次方(n ** 10) |
求余数(n % 10) |
矩阵对应元素 加减乘除等 | n + n1 |
n - n1 |
矩阵乘法(线性代数) | np.dot() |
矩阵的逆 | np.linalg.inv(n1) |
矩阵的行列式的值 | np.linalg.det(n1) |
矩阵的秩 | np.linalg.matrix_rank(n1) |
二、广播机制 |
1.为缺失的维度补充维度 | 2.缺失元素用以有值填充 |
三、其他数学操作 |
绝对值 | np.abs(n) |
平方 | np.square(n) |
指数e | np.exp(n) |
自然对数,以e为底 | np.log(n) |
以2为底 | np.log2(n) |
以10为底 | np.log10(n) |
正弦 | np.sin(n) |
余弦 | np.cos(n) |
正切 | np.tan(n) |
四舍五入 | np.round(n, 2) |
向上取整 | np.ceil(n) |
向下取整 | np.floor(n) |
累加
每一位的数值都是从最前边到它本身的求和 | np.cumsum(n) |
# import numpy as np
# import pandas as pd
# import matplotlib.pyplot as plt
#
# n = np.arange(10)
# n1 = np.random.randint(0, 10, size=(3, 5))
# print('np.sum(n):\n', np.sum(n), '\n') # 45
# print('np.sum(n1):\n', np.sum(n1), '\n') # 82
# print('np.sum(n1):\n', np.sum(n1, axis=1), '\n') # axis=0:每一列的多行求和
#
# print('np.max(n1):\n', np.max(n1), '\n')
# print('np.min(n1):\n', np.min(n1), '\n')
# print('np.mean(n1):\n', np.mean(n1), '\n')
# print('np.average(n1):\n', np.average(n1), '\n')
# print('np.median(n1):\n', np.median(n1), '\n')
# print('np.percentile(n1):\n', np.percentile(n1, q=50), '\n') # 百分位数,表示中位数
#
# n1 = n1.reshape(-1)
# print(n1)
# print('np.argmax(n1):\n', np.argmax(n1), '\n') # 第一个最大值对应的下标
# print('np.argwhere(n1):\n', np.argwhere(n1 == np.max(n1)), '\n') # 按照条件找到所有最大值的下标
# print('np.power(n1):\n', np.power(n1, 2), '\n') # 等于n ** 2
# print('np.std(n1):\n', np.std(n1), '\n')
# print('np.var(n1):\n', np.var(n1), '\n')
#
# n2 = np.array([1, 2, 3, np.nan])
# print('n2:', n2)
# print('np.sum(n2):\n', np.sum(n2), '\n') # nan
# print('np.nansum(n2):\n', np.nansum(n2), '\n') # 6.0
# import numpy as np
# import pandas as pd
# import matplotlib.pyplot as plt
#
# # n = np.random.randint(0, 10, size=(4, 5))
# # print('n:\n', n, '\n')
# # print('n:\n', n + 10, '\n') # 加法
# # print('n:\n', n - 10, '\n') # 减法
# # print('n:\n', n * 10, '\n') # 乘法
# # print('n:\n', n / 10, '\n') # 除法
# # print('n:\n', n // 2, '\n') # 整除法
# # print('n:\n', n ** 2, '\n') # 次方
# # print('n:\n', n % 2, '\n') # 余数
# #
# # n1 = np.random.randint(0, 10, size=(4, 5))
# # print('n + n1:\n', n + n1, '\n')
# # print('n - n1:\n', n - n1, '\n')
# # print('n * n1:\n', n * n1, '\n')
# # print('n * n1:\n', n / n1, '\n')
#
# n1 = np.random.randint(0, 10, size=(4, 4))
# n2 = np.random.randint(0, 10, size=(4, 4))
# print('np.dot(n1, n2):\n', np.dot(n1, n2), '\n')
# print('np.linalg.inv(n1):\n', np.linalg.inv(n1), '\n') # 矩阵的逆
# print('np.linalg.det(n1):\n', np.linalg.det(n1), '\n') # 矩阵的行列式的值
# print('np.linalg.matrix_rank:\n', np.linalg.matrix_rank(n1), '\n') # 矩阵的秩:4-->>满秩
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# m = np.ones((2, 3), dtype=np.int8)
# n = np.arange(3) # [0,1,2]
#
# print('m + n:\n', m + n, '\n') # 这里用已有数值帮助a矩阵补充了一个维度
#
# a = np.arange(3).reshape((3, 1))
# b = np.arange(3)
# print('a + b:\n', a + b, '\n') # 变成了3行3列
#
#
# c = np.ones((4, 1), dtype=np.int8)
# d = np.arange(4)
# print('c + d:\n', c + d, '\n') # 变成了4行4列
n = np.array([1, 4, 8, 9, 16, 25, 64])
print('np.abs(n):\n', np.abs(n), '\n') # 绝对值
print('np.square(n):\n', np.square(n), '\n') # 平方
print('np.exp(n):\n', np.exp(n), '\n') # 指数e
print('np.log(n):\n', np.log(n), '\n') # 自然对数,以e为底
print('np.log2(n):\n', np.log2(n), '\n') # 以2为底
print('np.log10(n):\n', np.log10(n), '\n') # 以10为底
print('np.sin(n):\n', np.sin(n), '\n') # 正弦
print('np.cos(n):\n', np.cos(n), '\n') # 余弦
print('np.tan(n):\n', np.tan(n), '\n') # 正切
print('np.round(n, 2):\n', np.round(n, 2), '\n') # 四舍五入
print('np.ceil(n):\n', np.ceil(n), '\n') # 向上取整
print('np.floor(n):\n', np.floor(n), '\n') # 向下取整
print('np.cumsum(n):\n', np.cumsum(n), '\n') # 累加 ,每一位的数值都是从最前边到它本身的求和
8.numpy的数组快速排序
排序
np.sort(n) | 不改变原来的数组 |
n.sort() | 改变原来的数组。不多占内存空间 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n1 = np.random.randint(0, 10, size=6)
n2 = np.sort(n1)
print('np.sort(n1):\n', n2, '\n') # 不改变输入
n3 = np.random.randint(0, 10, size=6)
n3.sort()
print('n3:\n', n3, '\n')
9.numpy的文件操作
np.save | 保存ndarray到一个npy文件 |
np.savez | 将多个ndarray保存到一个npy文件 |
np.load('x.npy') | 读取文件 |
np.load('arr.npz')['xarr'] | 读取文件 |
np.savetxt('arr.csv', n, delimiter=',') | csv文件的保存
|
np.loadtxt('arr.csv', delimiter=',') | csv文件的读取 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x = np.arange(5)
y = np.arange(10, 20)
np.save('x', x) # 保存文件
print(np.load('x.npy')) # 读取文件
np.savez('arr.npz', xarr=x, yarr=y) # 保存文件
print(np.load('arr.npz')['xarr']) # 读取文件
# csv,txt文件的读写功能
n = np.random.randint(0, 10, size=(3, 4))
# 存储到csv或者txt
np.savetxt('arr.csv', n, delimiter=',') # 加上分隔符,不用默认的
print(np.loadtxt('arr.csv', delimiter=',')) # 读取文件
10.numpy的练习
10.1 创建一个长度为10的一维全部为0 的ndarray对象,然后让第5个元素等于1
import numpy as np
n = np.zeros(10, dtype=np.int8)
n[4] = 1
print(n) # [0 0 0 0 1 0 0 0 0 0]
10.2 创建一个元素为10到49的ndarray对象
import numpy as np
n = np.arange(10, 50)
10.3 将第2题的所有元素位置反转
import numpy as np
n = np.arange(10, 50)
n = n[::-1]
10.4 使用np.random.random创建一个10*10的ndarray对象,并且打印出最大最小元素
import numpy as np
n = np.random.random(size=(10, 10))
print(np.max(n), np.min(n)) # 0.9826860473514594 0.002145136701101058
10.5 创建一个10*10的ndarray对象,且矩阵边界都是1,里边全是0
import numpy as np
# 方法一
# n = np.zeros((10, 10), dtype=np.int8)
# n[[0, -1]] = 1
# n[:, [0, -1]] = 1
# 方法二
n = np.ones((10, 10), dtype=np.int8)
n[1: -1, 1: -1] = 0
print(n)
10.6 创建一个每一行都是从0到4的5*5矩阵
import numpy as np
l = [0, 1, 2, 3, 4]
n = np.array(l*5).reshape((5, 5))
print(n)
10.7 创建一个范围在(0,1)之间的长度为12的等差数列
import numpy as np
n = np.linspace(0, 1, 12)
10.8 创建一个长度为10的随机数组并且排序
import numpy as np
n = np.random.randint(0, 10, 10)
n.sort() # 升序
n[::-1] # 翻转降序
10.9 创建一个长度为10 的随机数组并且将最大值替换成0
import numpy as np
n = np.random.randint(0, 10, size=10)
max1 = np.max(n)
max_index = np.argwhere(n == max1).reshape(-1) # 所有最大值的索引
n[max_index] = 0
10.10 给定一个4维矩阵,如何得到最后两维的和?
import numpy as np
n = np.random.randint(0, 10, size=(2, 3, 4, 5)) # 四维
n1 = n.sum(axis=(2, 3))
10.11 给定数组[1,2,3,4,5],如何得到这个数组的每个元素之间插入3个0后的新数组?
import numpy as np
n = np.arange(1, 6)
n2 = np.zeros(17, dtype=np.int8)
n2[::4] = n # 每隔4个数放一个n
10.12 给定一个二维矩阵,如何交换其中两行的元素
import numpy as np
n = np.random.randint(0, 10, size=(4, 4))
# 利用索引交换行
n2 = n[[1, 0, 2, 3]]
10.13 创建一个100000长度的随机数组,使用两种方法对其求三次方,并且比较使用的时间
*pycharm 里边报错
10.14 创建一个5*3 的随机矩阵和一个3*2的随机矩阵,求矩阵的积
import numpy as np
n1 = np.random.randint(0, 100, size=(5, 3))
n2 = np.random.randint(0, 100, size=(3, 2))
print(np.dot(n1, n2))
10.15 矩阵的每一行的元素都减去该行的平均值
import numpy as np
n = np.random.randint(0, 10, size=(3, 4))
n2 = n.mean(axis=1).reshape(3, 1)
print(n - n2)
10.16 打印出一下矩阵(要求使用np.zeros创建8*8的矩阵)
![](https://img-blog.csdnimg.cn/9c8dd469db5e4a3f8a50f674a4ee7693.jpeg)
import numpy as np
n = np.zeros((8, 8), dtype=np.int8)
n[::2, 1::2] = 1
n[1::2, 0::2] = 1
10.17 正则化一个5*5的随机矩阵
正则的概念:假设a是矩阵中的一个元素,max/min分别是矩阵的元素的最大值与最小值,则正则化后a = (a - min) /(max - min)
import numpy as np
n = np.random.randint(0, 100, size=(5, 5))
min1 = n.min()
max1 = n.max()
print(min1, max1)
print((n - min1)/(max1 - min1))