前言
Numpy是一个开源的Python科学计算基础库,也是目前Python用于科学计算和数据分析的最基础的第三方库,本文的主要内容是基于中国大学mooc(慕课)中的“Python数据分析与可视化”课程ndarray的使用基础进行整理和总结。
numpy简介
Numpy提供了众多功能,主要包含如下:
- Numpy提供了一个非常强大的N维数组对象ndarray(数组);
- 提供一个具有广播功能的函数,可用于数组之间的计算;
- 提供了线性代数,傅里叶变换,随机数生成等功能用于科学计算。
可以说Numpy是SciPy,Pandas等数据处理或科学计算库的基础。
虽然Python中已经具有类似功能的列表和元组供用户使用,为什么还需要Numpy呢?使用Numpy中N维数组对象ndarray代替Python中的列表/字典等进行科学计算的优势在于:
- 数组运算可以去掉元素之间所需要的循环语句,使一维向量更像单个数据;
- 通过设置专门的数组对象,经过优化,可以提升这类应用的运算速度;
- 在科学计算中,一个维度的所有数据类型往往相同,数组对象采用相同的数据类型,有助于节省运算和存储空间;
ndarray是一个多维数组对象,由两部分构成:
- 实际的数据;
- 描述这些数据的元数据(数据维度,数据类型等);
ndarray 的两个基本概念:
- 轴(axis):保存数据的维度;
- 秩(rank):轴的数量;
ndarray基本运算属性
ndarray的基本运算属性:
- .ndim:表示秩,即轴的数量或者维度的数量;
- .shape:ndarray对象的尺度,对于矩阵,n行m列;
- .size:ndarray对象元素的个数,相当于.shape中n*m的值
- .dtype:ndarray对象的元素类型;
- .itemsize:ndarray对象中每个元素的大小,以字节为单位。
ndarray实例如下:
import numpy as np
a = np.array([[1,2,3,4],
[5,6,7,8]])
a.ndim
2
a.shape
(2, 4)
a.size
8
a.dtype
dtype('int32')
a.itemsize
4
此处a.itemsize = 4表示数据a中每个元素由4个字节构成。
非同质对象
ndarray数组可以由非同质对象构成,但是非同质对象无法有效发挥Numpy的优势,应该尽量避免使用,如下例所示:
b = np.array([[1,2,3,4,5],
[6,7,8,9]])
b.shape
(2,)
b.dtype
dtype('O')
b
array([list([1, 2, 3, 4, 5]), list([6, 7, 8, 9])], dtype=object)
b.size
2
由上可以,当ndarray不同质时,元素为对象类型(Object)。
ndarray的创建方法
从Python中的列表,元组等类型创建ndarray数组;
从列表类型创建
x = np.array([1,2,3,4])
print(x)
[1 2 3 4]
从元组类型创建
y = np.array((1,2,3,4))
print(y)
[1 2 3 4]
从列表和元组混合类型创建
z = np.array([[1,2],
[3,4],
(5,6)])
print(z)
[[1 2]
[3 4]
[5 6]]
使用NumPy中的函数创建ndarray数组,如:arange,ones,zeros等;
np.arange:类似range()函数,返回ndarray类型,元素从0到n-1
np.arange(8)
array([0, 1, 2, 3, 4, 5, 6, 7])
np.ones(shape):根据shape生成一个全1数组,shape是元组类型
np.ones((3,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
np.zeros(shape):根据shape生成一个全0数组,shape是元组类型
np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
np.full(shape,val):根据shape生成一个数组,所有元素值都是val
np.full((3,5),3.5)
array([[3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5]])
np.eye(n):创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.ones_like(a):根据数组a的形状生成一个全为1的数组;
np.zeros_like(a):根据数组a的形状生成一个全为0的数组;
np.full_like(a,val):根据数组a的形状生成一个数组,每个元素的值都是val;
使用其他函数创建numpy数组
np.linspace(a,b,c):根据起止数据等间地填充数据,形成数组,a表示起始位置,b是最后一个元素的值,c是元素个数;
d = np.linspace(1,15,5)
d
array([ 1. , 4.5, 8. , 11.5, 15. ])
e = np.linspace(1,15,5,endpoint=False)
e
array([ 1. , 3.8, 6.6, 9.4, 12.2])
endpoint表示是否取最后一个元素的值,False表示舍去。
np.concatenate():将两个或多个数组合并成为一个新的数组;
f = np.concatenate((d,e))
f
array([ 1. , 4.5, 8. , 11.5, 15. , 1. , 3.8, 6.6, 9.4, 12.2])
从字节流(raw bytes)中创建ndarray数组;
从文件中读取特定格式,创建ndarray数组;
ndarray的数组变换
对于创建的ndarray数组,可以对其进行维度变换和元素类型变换。
维度变换
.reshape(shape):不改变数组元素,返回一个shape形状的数组,原数组不变;
a = np.ones((2,3,4))
a.reshape((3,8))
array([[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
a
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
.resize(shape):与.reshape()功能一致,但是修改原数组;
a.resize((3,8))
a
array([[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
.swapaxes(ax1,ax2):将数组中n个维度中的指定两个维度互换;
.flatten():对数组进行降维,返回折叠后的一维数组,原数组不变;
a.flatten()
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1.])
类型变换
new_a = a.astype(new_type)
b = np.ones((2,3),dtype = np.int)
b
array([[1, 1, 1],
[1, 1, 1]])
b.astype(np.float)
array([[1., 1., 1.],
[1., 1., 1.]])
ndarray数组向列表的转换
a.tolist()
b.tolist()
[[1, 1, 1], [1, 1, 1]]
ndarray数组的操作(索引和切片)
定义
索引:获取数组中特定元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片
一维数组的索引和切片与列表类似
a = np.array([1,2,3,4,5,6,7,8,9])
a[2]
3
a[1:7:2]
array([2, 4, 6])
多维数组索引和切片
a = np.arange(24).reshape(2,3,4)
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]]])
a[1,2,3]
23
a[0,1,3]
7
a[-1,-2,-3]
17
切片
a[:,1,-1]
array([ 7, 19])
a[:,1:3,:]
array([[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
a[:,:,::2]#每个维度可以使用步长跳跃切片
array([[[ 0, 2],
[ 4, 6],
[ 8, 10]],
[[12, 14],
[16, 18],
[20, 22]]])
ndarray数组的运算
数组与标量的运算
等价于数组中的每一个元素都与这个元素进行运算。
a = np.arange(24).reshape(2,3,4)
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]]])
a.mean()
11.5
a = a/a.mean()
a
array([[[0. , 0.08695652, 0.17391304, 0.26086957],
[0.34782609, 0.43478261, 0.52173913, 0.60869565],
[0.69565217, 0.7826087 , 0.86956522, 0.95652174]],
[[1.04347826, 1.13043478, 1.2173913 , 1.30434783],
[1.39130435, 1.47826087, 1.56521739, 1.65217391],
[1.73913043, 1.82608696, 1.91304348, 2. ]]])
对ndarray中的数据执行元素级运算的函数
- 计算各元素的绝对值:np.abs(x),np.fabs(x)
- 计算数组各元素的平方根:np.sqrt(x)
- 计算数组各元素的平方:np.square(x)
- 计算数组各元素的自然对数,10底对数和2底对数:np.log(x),np.log10(x),np.log2(x)
- 计算数组各元素的ceiling值(不超过元素的整数值)或floor值(小于该元素的最大整数值):np.ceil(x),np.floor(x)
- 计算数组各元素的四舍五入值:np.rint(x) 将数组各元素的小数和整数部分以两个独立数组形式返回:np.modf(x)
a
array([[[0. , 0.08695652, 0.17391304, 0.26086957],
[0.34782609, 0.43478261, 0.52173913, 0.60869565],
[0.69565217, 0.7826087 , 0.86956522, 0.95652174]],
[[1.04347826, 1.13043478, 1.2173913 , 1.30434783],
[1.39130435, 1.47826087, 1.56521739, 1.65217391],
[1.73913043, 1.82608696, 1.91304348, 2. ]]])
c,d = np.modf(a)
c
array([[[0. , 0.08695652, 0.17391304, 0.26086957],
[0.34782609, 0.43478261, 0.52173913, 0.60869565],
[0.69565217, 0.7826087 , 0.86956522, 0.95652174]],
[[0.04347826, 0.13043478, 0.2173913 , 0.30434783],
[0.39130435, 0.47826087, 0.56521739, 0.65217391],
[0.73913043, 0.82608696, 0.91304348, 0. ]]])
d
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 2.]]])
- 计算数组各元素的普通型和双曲型三角函数:np.cos(x)/np.cosh(x),np.sin(x)/np.sinh(x),np.tan(x)/np.tanh(x)
- 计算数组中各元素的指数值:np,exp(x)
- 计算数组中各元素的符号值:np.sign(x),大于0取1,等于0取0,小于0取-1,以数组形式返回
a = np.array([-1,0,1])
np.sign(a)
array([-1, 0, 1])
总结
- 数据的维度:一维,二维,多维;
- ndarray的类型属性,创建和变换;
- 数组的索引和切片;
- 数组的运算;
可以看到,numpy中涉及到的函数和语法较多,我们实际应用中并不需要对其进行死记硬背,只需要在使用某个函数时,进行查表,明白使用的原理和规则即可。
1048



被折叠的 条评论
为什么被折叠?



