Numpy是一个开源的Python科学计算基础库。
Numpy是SciPy、Pandas等数据处理或科学计算库的基础。
Numpy的引用:
import numpy as np
引用使用别名np,尽管别名可以省略或更改,建议使用上述约定的别名。
例:计算A2+B3,其中,A和B是一维数组
def pySum():
a=[0,1,2,3,4]
b=[9,8,7,6,5]
c=[]
for i in range(len(a)):
c.append(a[i]**2 + b[i]**3)
return c
print(pySum())
import numpy as np
def npSum():
a=np.array([0,1,2,3,4])
b=np.array([9,8,7,6,5])
c=a**2+b**3
return c
print(npSum())
第二种方法使用Numpy库直接给出a,b两个数组即可,然后计算得到结果,不需要写循环。
数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据。
设置专门的数组对象,经过优化,可以提升这类应用的运算速度。
科学计算中,一个维度所有数据的类型往往都相同。数组对象采用相同的数据类型,有助于节省运算和存储空间。
ndarray是一个多维数组对象,由两部分构成:实际数据、描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
np.array()生成一个ndarray数组,ndarray在程序中的别名是array。np.array()输出成[]形式,元素由空格分割。
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray对象的尺度,对于矩阵,n行m列 |
.size | ndarray对象元素的个数,相当于.shape中n*m的值 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
In[1]:
import numpy as np
arr1=np.array([1,2,3,4])
print('创建的数组为:',arr1)
arr2=np.array([[1,2,3,4],[2,3,4,5]])
print(arr2)
Out[1]:
创建的数组为: [1 2 3 4]
[[1 2 3 4]
[2 3 4 5]]
In[2]:
arr2.shape#查看数组结构
Out[2]:
(2, 4)
In[3]:
arr2.dtype#查看数组类型
Out[3]:
dtype('int32')
In[4]:
arr2.size#查看数组元素个数
Out[4]:
8
In[5]:
arr2.itemsize#查看数组每个元素大小
Out[5]:
4
In[6]:
arr2.ndim#数组的维度
Out[6]:
2
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中ssize_t一致,int32或int64 |
int8 | 字节长度的整数,取值:[-128,127] |
int16 | 16位长度的整数,取值:[-32768, 32767] |
int32 | 32位长度的整数,取值:[-231, 232-1] |
int64 | 64位长度的整数,取值:[-263, 263-1] |
uint8 | 8位无符号整数,取值[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值:[0,232-1] |
uint64 | 64位无符号整数,取值:[0,264-1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
对比:Python语法仅支持整数、浮点数和复数3种类型
科学计算涉及数据较多,对存储和性能都有较高要求。
对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能。
对元素类型精细定义,有助于程序员对程序规模有合理评估。
ndarray数组可以由非同质对象构成。非同质ndarray元素为对象类型。
非同质ndarray对象无法有效发挥Numpy优势,尽量避免使用。
In[7]:
x=np.array([[0,1,2,3,4],[9,8,7,6]])
x.shape
Out[7]:
(2,)
In[8]:
x.dtype
Out[8]:
dtype('O') #O类型表示对象,元素维度数据不同,将每个元素都视为一个对象
In[9]:
x
Out[9]:
array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object)
x=np.array(list/tuple)
x=np.array(list/tuple, dtype=np.float32)
In[1]: np.arange(0,1,0.1) #产生有起点和终点的固定步长的数组,起点默认0,步长默认1
Out[1]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
In[2]: np.linspace(0,1,12) #产生12个[0,1]区间的数
Out[2]: array([0. , 0.09090909, 0.18181818, 0.27272727, 0.36363636,
0.45454545, 0.54545455, 0.63636364, 0.72727273, 0.81818182,
0.90909091, 1. ])
In[3]: np.logspace(0,2,20)#产生[0,2]之间的等比数列
Out[3]: array([ 1. , 1.27427499, 1.62377674, 2.06913808,
2.6366509 , 3.35981829, 4.2813324 , 5.45559478,
6.95192796, 8.8586679 , 11.28837892, 14.38449888,
18.32980711, 23.35721469, 29.76351442, 37.92690191,
48.32930239, 61.58482111, 78.47599704, 100. ])
In[4]: np.eye(4)#产生单位矩阵
Out[4]: array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
In[5]: np.diag([1,2,3,4])
Out[5]: array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
In[6]: np.zeros((2,3))#产生0数组
Out[6]: array([[0., 0., 0.],
[0., 0., 0.]])
In[7]: np.ones([4,3])#产生全1数组
Out[7]: array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
#np.ones_like(a)根据数组a的形状生成一个全1数组
#np.zeros_like(a)根据数组a的形状生成一个全0数组
#np.full_like(a,val)根据数组a的形状生成一个数组,值全为val
In[8]: np.random.random(100)#无约束条件下生成随机数
Out[8]: array([0.67781333, 0.09641575, 0.81744244, 0.51278574, 0.98454235,
0.86534111, 0.33520735, 0.21342638, 0.06603498, 0.01996554])
In[9]: np.random.rand(4,5)#服从“0~1”均匀分布的数组
Out[9]: array([[0.68965255, 0.23693354, 0.08128558, 0.05926917, 0.85667476],
[0.0832 , 0.21984451, 0.39034674, 0.62013218, 0.58911233],
[0.20491853, 0.35134618, 0.79328201, 0.82678033, 0.41156243],
[0.95250391, 0.39173906, 0.93848367, 0.62982597, 0.76634915]])
#服从标准正态分布的数组,基本上取值主要在-1.96~+1.96之间
In[10]: np.random.randn(4,5)
Ou[10]: array([[-0.16638873, -0.07524763, -0.65528112, 0.03723065, 1.72830986],
[-2.54330122, 0.93422113, 0.94859713, -0.23486067, -0.03668511],
[-0.07051164, -0.0346533 , 1.13803941, 0.43895906, 1.58496663],
[-0.51918301, -0.30385197, 1.39331684, 0.52738113, 0.69320662]])
#生成给定范围的随机数,如最小值不小于2,最大值不大于10的2行5列数组
In[11]: np.random.randint(2,10,size=[2,5])
Out[11]: array([[7, 6, 5, 7, 7],
[2, 3, 7, 8, 2]])
函数 | 说明 |
---|---|
rand(d0,d1,…,dn) | 根据d0~dn创建随机数数组浮点数,[0,1],均匀分布 |
randn(d0,d1,…,dn) | 根据d0~dn创建随机数数组,标准正态分布 |
randint(low[,high,shape]) | 根据shape创建随机整数或整数数组,范围是[low,high) |
seed(s) | 随机数种子,s是给定的种子值 |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变数组a |
shuffle(a) | 根据数组a的第1轴进行随机排序,改变数组a |
choice(a[,size,replace,p]) | 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False |
binomial | 产生二项分布的随机数 |
normal(loc,scale,size) | 产生正太(高斯)分布的数组,loc均值,scale标准差,size形状 |
poisson(lam,size) | 产生泊松分布的数组,lam随机事件发生率,size形状 |
beta | 产生beta分布的随机数 |
chisquare | 产生卡方分布的随机数 |
gamma | 产生gamma分布的随机数 |
uniform(low,high,size) | 产生在[low,high)均匀分布的随机数,size形状 |
从字节流中创建ndarray数组
从文件中读取特定格式,创建ndarray数组
索引:获取特定位置的元素;
切片:获取数组元素子集。
In[0]: arr=np.arange(10)
arr[5]#整数下标访问,下标从0开始
Out[0]: 5
In[1]: arr[3:5]#范围访问,包括左边不包括右边
Out[1]: array([3, 4])
In[2]: arr[:5]#省略左下标,表示从arr[0]开始
Out[2]: array([0, 1, 2, 3, 4])
In[3]: arr[-1]#下标可以用负数,表示从后往前数的第几个元素
Out[3]: 9
In[4]:arr[2:4]=100,101 #下标修改元素
arr
Out[4]:array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
In[5]:arr[1:-1:2] #开始编号:终止编号(不含):步长,2表示隔一个取一个元素
Out[5]:array([ 1, 101, 5, 7])
In[6]:arr[5:1:-2] #步长为负数时,左下标必须>右下标
Out[6]:array([ 5, 101])
In[1]:arr=np.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
arr
Out[1]:array([[ 1, 2, 3, 4, 5],
[ 4, 5, 6, 7, 8],
[ 7, 8, 9, 10, 11]])
In[2]:arr[0,3:5] #第0行中第3和第4列的元素
Out[2]:array([4, 5])
In[3]:arr[1:,2:] #第2和3行中第3—5列的元素
Out[3]:array([[ 6, 7, 8],
[ 9, 10, 11]])
#从两个序列的对应位置取出两个整数来组成下标:arr[0,1],arr[1,2],arr[2,3]
In[4]:arr[[(0,1,2),(1,2,3)]]
Out[4]:array([ 2, 6, 10])
# 第2、3行中第0、2、3列的元素
In[5]:arr[1:,(0,2,3)]
Out[5]:array([[ 4, 6, 7],
[ 7, 9, 10]])
# mask是一个布尔数组,它索引第1、3行中第2列的元素
In[6]:mask=np.array([1,0,1],dtype=np.bool)
arr[mask,2]
Out[6]:array([3, 9])
In[1]:arr=np.arange(12)
arr
Out[1]:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[2]:arr.reshape(3,4)#重新设置数组形状
Out[2]:array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[3]:arr.reshape(3,4).ndim #查看数组维度
Out[3]:2
In[1]:arr=np.arange(12).reshape(3,4)
arr
Out[1]:array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[2]:arr.ravel()
Out[2]:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[3]:arr.flatten()#横向展平
Out[3]:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[4]:arr.flatten('F') #纵向展平
Out[4]:array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11])
函数 | 说明 |
---|---|
np.abs(x) np.fabs(x) | 计算各元素的绝对值 |
np.sqrt(x) | 平方根 |
np.square(x) | 平方 |
np.log(x) np.log10(x) np.log2(x) | 自然对数、10底对数和2底对数 |
np.ceil(x) np.floor(x) | ceiling值或floor值 |
np.rint(x) | 四舍五入值 |
np.modf(x) | 将数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) | 普通型和双曲型三角函数 |
np.exp(x) | 各元素的指数值 |
np.sign(x) | 符号值,1(+),0,-1(-) |
函数 | 说明 |
---|---|
+ - * / ** | 两个数组各元素进行对应运算 |
np.maximum(x,y) np.fmax() np.maximum(x,y) np.fmax() | 元素级的最大值/最小值 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
> < >= <= == != | 算术比较,产生布尔型数组 |
梯度:连续值之间的变化率,即斜率。XY坐标轴连续三个X坐标对应的Y轴值:a,b,c,其中,b的梯度为:(c-a)/2
np.gradient(f):计算数组f中元素的梯度,当f为多维时,返回每个维度梯度。
In[1] : import numpy as np
a=np.random.randint(0,20,(5))
a
Out[1]: array([ 5, 0, 10, 7, 8])
In[2] : np.gradient(a)#拿元素0举例,梯度=(10-5)/2
Out[2]: array([-5. , 2.5, 3.5, -1. , 1. ])
In[3] : c=np.random.randint(0,50,(3,5))
c
Out[3]: array([[45, 16, 20, 49, 27],
[25, 22, 18, 1, 15],
[34, 4, 17, 24, 13]])
In[4] : np.gradient(c)#会有两个数组,每个数组代表在第n维中的梯度
Out[4]: [array([[-20. , 6. , -2. , -48. , -12. ],
[ -5.5, -6. , -1.5, -12.5, -7. ],
[ 9. , -18. , -1. , 23. , -2. ]]),
array([[-29. , -12.5, 16.5, 3.5, -22. ],
[ -3. , -3.5, -10.5, -1.5, 14. ],
[-30. , -8.5, 10. , -2. , -11. ]])]
全称通用函数,是一种能够对数组中所有元素进行操作的函数。
广播是指不同形状的数组之间执行算术运算的方式。需要遵循个原则:
CSV(Comma-Separated Value,逗号分隔值),用来存储批量数据。
CSV数据存取可以使用np.loadtxt()和np.savetxt()函数。
主要有二进制文件的读写和文件列表形式的数据读写两种形式。
a=np.arange(100).reshape(5,20)
a
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99]])
a.tofile('b.dat',sep=',',format='%d')#写入文件b.dat
c=np.fromfile('b.dat',dtype=np.int,sep=',').reshape(2,2,25)#从文件b.dat中读取
c
array([[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24],
[25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49]],
[[50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74],
[75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99]]])
arr.sort()
sort函数也可以指定一个axis参数,使得sort函数可以沿着指定轴对数据集进行排序。axis=1为沿横轴排序;axis=0为沿纵轴排序。
argsort函数返回值为重新排序值的下标,arr.argsort()
lexsort函数返回值是按照最后一个传入数据排序的,np.lexsort((a,b,c))
axis=None是统计函数的标配参数。当axis=0时,表示沿着纵轴计算。当axis=1时,表示沿着横轴计算,默认时计算一个总值。
函数 | 说明 |
---|---|
sum(a, axis=None) | 根据给定轴axis计算数组a的元素之和,axis整数或元组 |
mean(a, axis=None) | 计算数组均值 |
average(a, axis=None, weight=None) | 计算数组元素的加权平均值 |
std(a, axis=None) | 计算数组标准差 |
var(a, axis=None) | 计算数组方差 |
min | 计算数组最小值 |
max | 计算数组最大值 |
argmin | 返回数组最小元素的降一维后下标 |
argmax | 返回数组最大元素的降一维后下标 |
unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 |
ptp(a) | 计算数组a中元素最大值与最小值的差 |
median(a) | 计算数组a中元素的中位数(中值) |
cumsum | 计算所有元素的累计和 |
cumprod | 计算所有元素的累计积 |