numpy介绍
numpy是python中的科学计算基础包,其核心是多维数组adarray。该库提供了用于数组计算的各种API,包括线性代数,统计,离散傅里叶变换等。
基础知识
- 轴:多维数组的维数成为轴,如 一维向量的轴是1,矩阵的轴是2。
- 常见属性
import numpy as np
a = np.arange(15).reshape(3,5)
#常见属性
print("数组的维度的个数:\t\t",a.ndim)
print("数组的形状:\t\t\t",a.shape)
print("数组元素的总数:\t\t", a.size)
print("数组的元素类型:\t\t", a.dtype)
print("每个元素占用的字节数:\t", a.itemsize)
数组创建
#数组创建
#从列表或者元组创建ndarray:根据传入的参数自动推断数据类型
#一维数组
a = np.array([1,2,3,4,5])
print(a.dtype)
a = np.array((1.0,2,3,4,5))
print(a.dtype)
#多维数组
a = np.array([[1,2],[3,4]])
print(a)
#指定数据类型
a = np.array([[1,2],[3,4]], dtype=np.complex)
print(a)
#创建占位数组,缺省情况下数据类型是float64
a = np.zeros((3,4))
a = np.ones((3,4))
#数组内容随机
a = np.empty((3,4))
#根据start,end和step创建数组:左开右闭
a = np.arange(0, 10, 1)
print(a)
#缺省start=0,step=1
a = np.arange(10)
#根据元素数量创建数组
a = np.linspace(0,10,11)
print(a)
print("\n\n\n")
基本运算
#基本运算
a = np.arange(10,20,1).reshape(2,5)
b = np.arange(10).reshape(2,5)
print("a = \n", a)
print("b = \n", b)
#矩阵加法
print("a+b = \n", a + b)
#对应元素相乘
print("a * b = \n", a * b)
#矩阵相乘
#矩阵维度相容才能进行乘法运算
b.resize(5,2)
print("a @ b = \n", a @ b)
print("a @ b = \n", a.dot(b))
#基本统计函数:缺省情况下应用与整个数组
print("sum of a:", a.sum())
print("max of a:", a.max())
print("min of a:", a.min())
print("avg of a:", a.mean())
print("std of a:", a.std())
#基本统计函数应用于某个维度
#第0轴从上到下:求每列的均值
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print("a = \n", a)
print("mean of each column", a.mean(axis = 0))
print("mean of each row", a.mean(axis=1))
print("\n\n\n")
通函数
#通函数(常见的数学函数):对每个元素操作
print("sin(a) = \n", np.sin(a))
索引
#索引:
# 一维数组:基本和python的原生数组一样
a = np.arange(10)
#单个元素
print(a[0])
print(a[-1])
#左开右闭
print(a[0:5])
print(a[:8])
print(a[8:])
#步长
print(a[:8:2])
print(a[::-1])
#多维数组
a = np.arange(20).reshape(4,5)
print("a = \n", a)
#单个元素
print(a[2,3])
print(a[2,-1])
#
print(a[2:3, 2:3])
print(a[2:3, :])
print(a[2:3])
print(a[:,2])
迭代
#迭代:对行完成
for i in a:
print(i)
#对数组中的每个元素迭代
for i in a.flat:
print(i, end=" ")
操纵形状
a = np.arange(15).reshape(5,3)
print(a.reshape(3,5))
print(a.reshape(3,-1))
#转置
print(a.T)
#展平成一维数组
print(a.ravel())
#此命令会改变数组本身
a.resize(15,1)
print(a)
数组堆叠
print("*****数组堆叠*****")
#数组堆叠
a = np.array(np.arange(20).reshape(4,5))
#水平堆叠
print(np.hstack((a,a)))
#垂直堆叠
print(np.vstack((a,a)))
#列堆叠
print(np.column_stack((a,np.arange(4))))
a = np.random.random((2,2))
b = np.random.random((2,2))
print(np.column_stack((a,b)))
#创建数组
print(np.r_[1:4, 6])
拆分数组
#拆分数组
print("*****拆分数组*****")
a = np.arange(27).reshape(3, -1)
print(a)
#水平拆分
a, b, c = np.hsplit(a, 3)
print(a)
print(b)
print(c)
拷贝和视图
#拷贝和视图
a = np.arange(15).reshape(3,-1)
#完全不复制:指向同一片空间,操作数组元素和形状都会改变
#函数调用就是这种情况
b = a
print(b is a) # True
#浅复制(视图)
b = a.view()
#共享数据:b的数组元素改变时,a也改变。但是b的形状改变时,a不变
#深复制:生成一个全新的副本
b = a.copy()
花式索引
#花式索引
#z整数数组索引
print("******花式索引******")
a = np.arange(20)
print("a = \n", a)
index = np.arange(start=0, stop = 20, step = 2)
print(a[index])
#a是多维数组,index是一维数组,索引行
a.resize(4,5)
print("a = \n", a)
#取出第0行和第2行
index = np.arange(start = 0, stop = 4, step = 2)
print(a[index])
#取出第0列和第2列
print(a[:,index])
#取出(0,0)和(2,2)
print(a[index, index])
#bool数组索引
print("*****bool数组索引*****")
#index和a一样大
index = np.zeros(a.shape, dtype=np.bool)
index[0:4:2] = True;
print(index)
print(a[index])
#bool数组索引应用于每一个维度
print("a = \n", a)
b1 = [True, True, False, False]
b2 = [False, False, False, True, True]
print(a[b1,:])
print(a[:,b2])
线性代数基础
#线性代数基础
print("*****线性代数基础*****")
a = np.arange(1,5,1)
a.resize(2,2)
print("a = \n", a)
print("转置:\n", a.transpose())
print("逆矩阵:\n", np.linalg.inv(a))
print("单位矩阵:\n", np.eye(2))
print("矩阵的迹:", a.trace())
a = np.random.random((3,3))
y = np.random.random((3,1))
print("求解线性方程组:", np.linalg.solve(a,y))
#求矩阵特征值和特征向量
print("a = \n", a)
print(np.linalg.eig(a))
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021010814563199.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcwODE2MQ==,size_16,color_FFFFFF,t_70)
# 直方图
```python
#直方图
print("*************直方图****************")
mu, sigma = 0, 1
v = np.random.normal(mu, sigma, 1000000000)
n, bins = np.histogram(v, bins=200000, density=True)
plt.plot(bins[1:], n)
print(0.5 * (bins[1:] + bins[:-1]), n.shape)
print("n = ", n)
print("bins = ", bins)
plt.show()
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210108145701724.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcwODE2MQ==,size_16,color_FFFFFF,t_70)
# 完整代码
```python
import numpy as np
import matplotlib.pyplot as plt
from numpy import newaxis
a = np.arange(15).reshape(3,5)
print(a)
#常见属性
print("*****常见属性*****")
print("数组的维度的个数:\t\t",a.ndim)
print("数组的形状:\t\t\t",a.shape)
print("数组元素的总数:\t\t", a.size)
print("数组的元素类型:\t\t", a.dtype)
print("每个元素占用的字节数:\t", a.itemsize)
#%%
print("*****数组创建*****")
#数组创建
#从列表或者元组创建ndarray:根据传入的参数自动推断数据类型
#一维数组
a = np.array([1,2,3,4,5])
print(a.dtype)
a = np.array((1.0,2,3,4,5))
print(a.dtype)
#多维数组
a = np.array([[1,2],[3,4]])
print(a)
#指定数据类型
a = np.array([[1,2],[3,4]], dtype=np.complex)
print(a)
#创建占位数组,缺省情况下数据类型是float64
a = np.zeros((3,4))
a = np.ones((3,4))
#数组内容随机
a = np.empty((3,4))
#根据start,end和step创建数组:左开右闭
a = np.arange(0, 10, 1)
print(a)
#缺省start=0,step=1
a = np.arange(10)
#根据元素数量创建数组
a = np.linspace(0,10,11)
print(a)
#%%
print("*****基本运算*****")
#基本运算
a = np.arange(10,20,1).reshape(2,5)
b = np.arange(10).reshape(2,5)
print("a = \n", a)
print("b = \n", b)
#矩阵加法
print("a+b = \n", a + b)
#对应元素相乘
print("a * b = \n", a * b)
#矩阵相乘
#矩阵维度相容才能进行乘法运算
b.resize(5,2)
print("a @ b = \n", a @ b)
print("a @ b = \n", a.dot(b))
#基本统计函数:缺省情况下应用与整个数组
print("sum of a:", a.sum())
print("max of a:", a.max())
print("min of a:", a.min())
print("avg of a:", a.mean())
print("std of a:", a.std())
#基本统计函数应用于某个维度
#第0轴从上到下:求每列的均值
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print("a = \n", a)
print("mean of each column", a.mean(axis = 0))
print("mean of each row", a.mean(axis=1))
print("\n\n\n")
#%%
print("*****通函数*****")
#通函数(常见的数学函数):对每个元素操作
print("sin(a) = \n", np.sin(a))
#%%
print("*****索引*****")
#索引
# 一维数组:基本和python的原生数组一样
a = np.arange(10)
#单个元素
print(a[0])
print(a[-1])
#左开右闭
print(a[0:5])
print(a[:8])
print(a[8:])
#步长
print(a[:8:2])
print(a[::-1])
#多维数组
a = np.arange(20).reshape(4,5)
print("a = \n", a)
#单个元素
print(a[2,3])
print(a[2,-1])
#
print(a[2:3, 2:3])
print(a[2:3, :])
print(a[2:3])
print(a[:,2])
#%%
print("*****迭代*****")
#迭代:对行完成
for i in a:
print(i)
#对数组中的每个元素迭代
for i in a.flat:
print(i, end=" ")
#%%
print("\n*********操纵形状***********")
#操纵形状
#下面三个命令返回一个指定形状的数组,但不会改变数组原始的形状
a = np.arange(15).reshape(5,3)
print(a.reshape(3,5))
print(a.reshape(3,-1))
#转置
print(a.T)
#展平成一维数组
print(a.ravel())
#此命令会改变数组本身
a.resize(15,1)
print(a)
#%%
print("*****数组堆叠*****")
#数组堆叠
a = np.array(np.arange(20).reshape(4,5))
#水平堆叠
print(np.hstack((a,a)))
#垂直堆叠
print(np.vstack((a,a)))
#列堆叠
print(np.column_stack((a,np.arange(4))))
a = np.random.random((2,2))
b = np.random.random((2,2))
print(np.column_stack((a,b)))
#创建数组
print(np.r_[1:4, 6])
#%%
#拆分数组
print("*****拆分数组*****")
a = np.arange(27).reshape(3, -1)
print(a)
#水平拆分
a, b, c = np.hsplit(a, 3)
print(a)
print(b)
print(c)
#%%
print("*****拷贝和视图*****")
#拷贝和视图
a = np.arange(15).reshape(3,-1)
#完全不复制:指向同一片空间,操作数组元素和形状都会改变
#函数调用就是这种情况
b = a
print(b is a) # True
#浅复制(视图)
b = a.view()
#共享数据:b的数组元素改变时,a也改变。但是b的形状改变时,a不变
#深复制:生成一个全新的副本
b = a.copy()
#广播
#%%
#花式索引
#z整数数组索引
print("******花式索引******")
a = np.arange(20)
print("a = \n", a)
index = np.arange(start=0, stop = 20, step = 2)
print(a[index])
#a是多维数组,index是一维数组,索引行
a.resize(4,5)
print("a = \n", a)
#取出第0行和第2行
index = np.arange(start = 0, stop = 4, step = 2)
print(a[index])
#取出第0列和第2列
print(a[:,index])
#取出(0,0)和(2,2)
print(a[index, index])
#bool数组索引
print("*****bool数组索引*****")
#index和a一样大
index = np.zeros(a.shape, dtype=np.bool)
index[0:4:2] = True;
print(index)
print(a[index])
#bool数组索引应用于每一个维度
print("a = \n", a)
b1 = [True, True, False, False]
b2 = [False, False, False, True, True]
print(a[b1,:])
print(a[:,b2])
#%%
#线性代数基础
print("*****线性代数基础*****")
a = np.arange(1,5,1)
a.resize(2,2)
print("a = \n", a)
print("转置:\n", a.transpose())
print("逆矩阵:\n", np.linalg.inv(a))
print("单位矩阵:\n", np.eye(2))
print("矩阵的迹:", a.trace())
a = np.random.random((3,3))
y = np.random.random((3,1))
print("求解线性方程组:", np.linalg.solve(a,y))
#求矩阵特征值和特征向量
print("a = \n", a)
print(np.linalg.eig(a))
#直方图
print("*************直方图****************")
mu, sigma = 0, 1
v = np.random.normal(mu, sigma, 1000000000)
n, bins = np.histogram(v, bins=200000, density=True)
plt.plot(bins[1:], n)
print(0.5 * (bins[1:] + bins[:-1]), n.shape)
print("n = ", n)
print("bins = ", bins)
plt.show()
```