提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录学习numpy的过程。
一、Numpy是什么?
NumPy(Numerical Python 的简称)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 的前身是 Numeric,这是一个由 Jim Hugunin 等人开发,专门用于数组运算的扩展模块,另一个和 Numeric 功能类似的扩展模块是 SciPy。由于 Numeric 中存在的一些问题,Jim Hugunin 发起了一个开发者团队开发了 NumPy,NumPy 将 Numeric 和 SciPy 整合进一个单独的库中。
NumPy 的主要特点包括:
-
强大的 N 维数组对象:NumPy 使用 ndarray 对象来存储和处理大型多维数组和矩阵,并提供大量的函数来操作这些数组。
-
广播功能:如前面所述,NumPy 提供了广播功能,这使得不同形状的数组能够执行算术操作。
-
用于整合 C/C++ 和 Fortran 代码的工具:NumPy 提供了许多用于整合 C、C++ 和 Fortran 代码的工具,使得开发者能够利用这些语言编写性能更高的代码,并集成到 Python 中。
-
线性代数、统计以及傅里叶变换:NumPy 提供了大量的函数,用于执行线性代数运算、统计运算和傅里叶变换等。
-
用于快速操作大型数组的函数:NumPy 提供了许多用于操作大型数组的函数,这些函数经过优化,可以高效地处理大量数据。
-
成熟的 C API:NumPy 的 C API 允许开发者使用 C 语言编写扩展模块,这些模块可以无缝地集成到 NumPy 中。
-
方便的 MATLAB 风格函数:NumPy 提供了许多与 MATLAB 类似的函数,这使得熟悉 MATLAB 的用户能够更容易地使用 NumPy。
此外numpy开源的python科学计算库,用于快速处理任意维度的数组
Numpy中,存储对象是ndarray
二、使用步骤
1.numpy如何使用
1.1创建
np.array([])
1.2numpy的优势
内存块风格--一体式存储支持井行化运算效率高于纯Python代码--底层使用了C,内部释放了GIL
2 N维数组
2.1ndarray的属性
属性名字 属性解释
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数
ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.dtype 数组元素的类型
import numpy as np
a=np.array([[2,3,4],[6,7,8]])
print(a.shape)
# 数组维数的元组 (2,3)
print(a.ndim)
# 数组维数,简单来说就是列表中套了几个列表
print(a.size)
# 数组中的元素数量 6
print(a.itemsize)
# 一个数组元素的长度(字节)
print(a.dtype)
# 数组元素的类型
2.2ndarray的形状
创建三维及以上数组时不好理解,以下仅展示三维数组的创建
b=np.array([[[1,2,3],[1,3,4]],[[2,5,6],[3,6,7]]])
print(b)
print(b.ndim)
print(b.shape)
怎么理解形状是(2,2,3)呢?
数组分为两大块,每个大块内又分为两小块,每个小块内有三个元素。
多维数组类似
2.3 ndarray的数据类型
int
float
str
...
若不指定,则整数默认int64,小数默认float64
import numpy as np
a=np.array([[2,3,4],[6,7,8]],dtype=np.float64)
print(a.dtype)
#float64
3.基本操作
3.1生成数组的方法
3.1.1生成0和1数组
np.ones(type) type=生成数组的形状
np.zeros()
import numpy as np
a=np.ones([3,4])
print(a)
b=np.ones_like(a)
print(b)
c=np.zeros([4,5])
print(c)
d=np.zeros_like(a)
print(d)
3.1.2从现有的数组中去创建
np.array()———返回深拷贝
np.asrray ()———返回浅拷贝
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
print(a)
b=np.array(a)
print(b)
c=np.asarray(a)
print(c)
3.1.3生成等间隔的数组
np.linspace(start,stop,num,endpoint)
start 序列的起始值
stop 序列的终止值,
num 要生成的等间隔样例数量,默认为50
endpoint 序列中是否包含stop值,默认为ture
import numpy as np
print(np.linspace(0,100,11))
输出结果: [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
np.arrange()
每间隔多少生成一个
import numpy as np
print(np.arange(0,10,2))
结果:[0 2 4 6 8]
3.1.4生成随机数组
np.random.rand(d0, d1,.., dn)
返回[0.0,1.0)内的一组均匀分布的数。
np.random.uniform(low=0.0, high=1.0,size=None)
功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.参数介绍:
low: 采样下界,float类型,默认值为0;
high: 采样上界,float类型,默认值为1;
size: 输出样本数目,为int或元组(tuple)类型(表示几行几列)
返回值:ndarray类型,其形状和参数size中描述一致。
np.random.randint(low,high=None, size=None, dtype=')
从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
np.random.randn(d0, d1, .... dn)
功能:从标准正态分布中返回一个或多个样本值
np.random.normal(loc=0.0,scale=1.0, size=None)
loc: float
此概率分布的均值(对应着整个分布的中心centre)
scale: float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size: int or tuple of ints
输出的shape,默认为None,只输出一个值
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5),dpi=100)
x=np.random.normal(1.7,1,10000000)
plt.hist(x,bins=1000)
plt.show()
np.random.standard_normal(size=None)返回指定形状的标准正态分布的数组。
3.2数组的索引、切片
直接索引
先对行进行索引,再进行列索引
import numpy as np
import matplotlib.pyplot as plt
a=np.random.standard_normal((5,6))
print(a)
print(a[0:2,0:2])
# print(a.resize([3,4]))
3.3形状修改
3.3.1.对象.reshape
不进行行列互换,产生新变量
import numpy as np
import matplotlib.pyplot as plt
a=np.random.standard_normal((5,6))
print(a)
print(a.reshape([6,5]))
![](https://img-blog.csdnimg.cn/direct/6702036b7b6841758c1914f57a27653d.png)
3.3.2.对象.resize
进行行列互换,对原值进行更改
即把“对象”改为你想变得形状
3.3.3.对象.T进行行列互换
import numpy as np
import matplotlib.pyplot as plt
a=np.random.standard_normal((5,6))
print(a)
print(a.T)
这里可以理解为转置
3.4.类型修改
对象.astype()
3.5.数组去重
np.unique()
3.6ndarray运算
3.6.1.逻辑运算
大于,小于直接进行判断赋值
满足要求,直接进行赋值
import matplotlib.pyplot as plt
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print()
print(a>0)
print()
a[a>0]=1
print(a)
3.6.2通用判断函数
np.all()
所有满足要求,才返回True
np.any()
只要有一个满足要求,就返回True
import matplotlib.pyplot as plt
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(np.all(a>0))
print(np.any(a>0))
3.6.3.三元运算符
np .where()满足要求,赋值第一个值,否则赋值第二个值
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(np.where(a>0,1,0))
np.logical and()
并
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(np.where(np.logical_and(a>0,a<1),1,0))
np.logical or()
或
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(np.where(np.logical_or(a>1,a<0),1,0))
3.6.4.统计运算
min
max
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(a.min())
print(a.max())
mean
std -----标准差
Var -----方差
import numpy as np
a=np.random.standard_normal([3,4])
print(a)
print(a.std())
print(a.var())
argmax---最大值下标
argmin--最小值下标
3.7 数组间运算
3.7.1.数组和数字是直接可以进行运算
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=3
print(a.shape)
print(a*b)
print(a/b)
3.7.2.数组和数组需要满足广播机制
在使用NumPy这样的科学计算库时,"广播"(Broadcasting)是一个非常重要的概念。广播是NumPy用于在不同形状的数组之间执行算术操作的一种机制,它使得NumPy能够像处理形状相同的数组一样处理形状不同的数组。
什么情况下可以进行广播计算?
下面举一些可以广播的例子与不能广播的例子
下面是不能广播的例子:
3.7.3.矩阵乘法
np.dot--点乘
np.matmul--矩阵相乘
注意:两者之间在进行矩阵相乘时候,没有区别但是,dot支持矩阵和数字相乘
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1],[2],[3]])
print(np.matmul(a,b))
print(np.dot(a,b))
下面将看到两者之间的差别