Numpy入门

2 篇文章 0 订阅
2 篇文章 0 订阅

Numpy入门

数据维度:

一组数据的组织形式

一维数据
  • 对等关系

  • 有序或无序

  • 线性的方式组织

对应列表、数组、集合等概念(在Python基础数据类型中没有数组类型,在Numpy库中,定义了数组ndarray类)

列表与数组的异同:

​ 同:都表示为一维数组的有序结构

​ 异:列表中可以有不同数据类型的数据

​ 数组中的数据类型必须相同(ndarray类中定义的数组可以存取不同数据类型的数据,但一般情况下数据类型相同)

二维数据
  • 由多个一维数据构成
  • 一维数据的组合形式

表格为典型的二维数据结构

二维数据可用列表表示

多维数据
  • 由一维或二维数据在新维度上扩展形成

比如,在一张数据表上增加时间维度

同样可用列表的套嵌表示

高维数据:
  • 仅利用最基本的二元关系(字典)展示数据间的复杂结构
  • 可用键值树表示

Numpy的数组对象:ndarray

ndarray的优势:
  • 数组对象可以去掉元素间运算所需要的循环,使一维向量更像单个数据
  • 设置专门的数组对象,经过优化可以提升这类应用的运算速度(底层由C语言实现)
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间

ndarray是一个多维数组对象,由两部分构成:

  • 实际的数据
  • 描述这些数据的元数据(数据维度、数据类型等)

ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始(这与列表类型相同)

一般通过

import numpy as np

引入Numpy库,并简称为np

可通过np.array()生成ndarray数组

print(np.array([1,2,3,4,5]))
[1 2 3 4 5]

np.array()输出成 [ ] 形式,元素有空格分隔

在ndarray数组中有两个概念:

  • 轴(axis):保存数据的维度
  • 秩(rank):轴的数量
ndarray属性:
属性描述
ndim秩,及轴的数量或维度数量
shape对象的尺度,对于矩阵即n行m列,返回元组
size对象元素的个数,相当于n*m
dtype对象的元素类型
itemsize对象中每个元素的大小,以字节表示
In [21]: a= np.array([[1,2,3,4,5],[6,7,8,9,10]])

In [22]: a.ndim
Out[22]: 2

In [23]: a.shape
Out[23]: (2, 5)

In [24]: a.size
Out[24]: 10

In [25]: a.dtype
Out[25]: dtype('int32')

In [26]: a.itemsize
Out[26]: 4

注:Numpy中存在有其自己定义的数据类型,大致与Python中的数据类型相同

ndarray数组的创建和变换

ndarray数组的创建方法:
  1. 从Python中列表、元组等类型创建ndarray数组

    np.array( list/tuple , dtype = np.float32 )

    In [27]:a = np.array([[0,1,2,3,4,],[5,6,7,8,9]],dtype=np.float32)
    
    In [28]:a
    Out[28]: 
    array([[0., 1., 2., 3., 4.],
           [5., 6., 7., 8., 9.]], dtype=float32)
    
  2. 使用Numpy中的函数创建ndarray数组

    方法描述
    np.arange(n)类似range()函数,返回ndarray数组,[0,n)
    np.ones(shape)根据shape生成一个全1数组,shape为元组
    np.zeros(shape)根据shape生成一个全0数组,shape为元组
    np.full(shape,val)根据shape生成一个全为val的数组,shape为元组
    np.eye(n)创建一个正方向n*n的单位矩阵
    np.ones_like(a)根据数组a生成一个全1数组,shape为元组
    np.zeros_like(a)根据数组a生成一个全0数组,shape为元组
    np.full_like(a,val)根据数组a生成一个全为val的数组,shape为元组
    np.linspace()根据起止数据,等间距填充数据
    np.concatenate()将两个或多个数组合并成一个新数组
  3. 从字节流(raw bytes)中创建ndarray数组

  4. 从文件中读取特定格式,创建ndarray

ndarray数组的变换:

对于创建后的ndarray数组,可对其进行维度变换和元素类型变换

方法描述
.reshape(shape)不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape)与np.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2)将数组n个维度中的两个维度进行调换
.flatten()对数据进行降维,返回折叠后的一维数组
.astype(new_type)改变数据类型
.tolist()转换为列表

对数组的操作

一维数组的索引与切片:
  • 索引:

​ 与Python列表类似

//使用np.arange()创建数组
In [9]:a = np.arange(0,23,2)

In [10]:a
Out[10]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22])
    
//对数组a进行索引,从0开始
In [11]:a[0]
Out[11]: 0
//同样存在负数的索引
In [12]:a[-1]
Out[12]: 22
  • 切片:

    同样与Python列表类似

In [13]:a[0:10:2]
Out[13]: array([ 0,  4,  8, 12, 16])

In [14]:a[::-1]
Out[14]: array([22, 20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0])
多维数组的索引与切片:
  • 索引

    根据维度从里到外索引

    每个维度用“,”风隔

    同样从0开始

//创建形状(2,3,4)的3维数组
In [2]:a = np.arange(0,24).reshape(2,3,4)
In [3]:a
Out[3]: 
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]]])

In [4]:a[0,2,2]						//索引
Out[4]: 10							//根据索引返回值
  • 切片

    每个维度切片用“,”风隔

    可对每个维度单独切片

    选去整个维度可用“:”,这与Python列表选取整个列表相同

    每个维度可用步长跳跃切片

//创建形状(2,3,4)的3维数组
In [2]:a = np.arange(0,24).reshape(2,3,4)		
In [3]:a
Out[3]: 
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]]])
//对每个维度切片
In [5]:a[:,1:2,:1]
Out[5]: 
array([[[ 4]],

       [[16]]])

//使用“:”选取整个维度,不对其切片
In [6]:a[:,:,0:3]
Out[6]: 
array([[[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10]],

       [[12, 13, 14],
        [16, 17, 18],
        [20, 21, 22]]])

//使用步长跳跃切片
In [7]:a[:,0::2,0::2]
Out[7]: 
array([[[ 0,  2],
        [ 8, 10]],

       [[12, 14],
        [20, 22]]])

PS:对多维数组的切片有点绕,不过仔细想想就明白了

ndarray数组运算

数组与标量之间的运算
  • 数组与标量之间的运算作用于数组的每个元素
  • .mean()计算数组平均值(即数组中每个元素之和 / 元素个数)
//创建形状(2,3,4)的3维数组
In [16]:a = np.arange(0,24).reshape(2,3,4)
In [17]:a
Out[17]: 
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]]])

//计算平均值
In [18]:a.mean()
Out[18]: 11.5
    
//每个元素都乘以4   
In [19]:a*4
Out[19]: 
array([[[ 0,  4,  8, 12],
        [16, 20, 24, 28],
        [32, 36, 40, 44]],

       [[48, 52, 56, 60],
        [64, 68, 72, 76],
        [80, 84, 88, 92]]])
Numpy一元函数
  • 对ndarray中的数据执行元素级运算的函数,即对每个元素都进行运算,返回结果
函数说明
np.abs(x)计算数组各元素的绝对值
np.fabs(x)计算数组各元素的绝对值
np.square(x)计算数组各元素的平方值
np.log(x)计算数组各元素的自然对数
np.log10(x)计算数组各元素的以10为底的对数
np.log2(x)计算数组各元素的以2为底的对数
np.ceil(x)计算数组各元素的大于其元素的最小整数值
np.floor(x)计算数组各元素的小于其元素的最大整数值
np.rint(x)将数组各元素四舍五入
np.modf(x)将各元素的小数和整数部分已两个独立数组返回
np.cos(x)计算数组各元素的cos值
np.sin(x)计算数组各元素的sin值
np.tan(x)计算数组各元素的tan值
np.cosh(x)计算数组各元素的双曲型三角函数cosh值
np.sinh(x)计算数组各元素的双曲型三角函数sinh值
np.tanh(x)计算数组各元素的双曲型三角函数tanh值
np.exp(x)计算数组各元素的指数值
np.sign(x)计算数组各元素的符号值,正为1,其他为0
np.sqrt(x)平方根
Numpy二元函数
函数说明
+ - * / **两个数组各元素进行对应运算
np.maximum(x,y)元素级的最大值计算
np.fmax(x,y)元素级的最大值计算
np.minimum(x,y)元素级的最小值计算
np.fmin(x,y)元素级的最小值计算
np.mod(x,y)元素级的模运算
np.copysign(x,y)将数组y中各元素值得符号赋值给数组x对应元素
> < >= <= == !=算数比较,产生布尔型数组

注:不管对数组进行一元二元还是与标量之间的计算,只要返回的结果是数值型,返回数组的数据类型都为float64

如:

In [25]:a = np.arange(0,24).reshape(2,3,4)

//a的数据类型为‘int32’
In [26]:a.dtype
Out[26]: dtype('int32')

//对数组a进行开平方操作,得到数组b
In [27]:b = np.sqrt(a)

In [28]:b
Out[28]: 
array([[[0.        , 1.        , 1.41421356, 1.73205081],
        [2.        , 2.23606798, 2.44948974, 2.64575131],
        [2.82842712, 3.        , 3.16227766, 3.31662479]],

       [[3.46410162, 3.60555128, 3.74165739, 3.87298335],
        [4.        , 4.12310563, 4.24264069, 4.35889894],
        [4.47213595, 4.58257569, 4.69041576, 4.79583152]]])

//对数组a与数组b比较其大小
In [29]:c = np.fmax(a,b)

In [30]:c
Out[30]: 
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的‘int32’,而是‘float64’
In [31]:c.dtype
Out[31]: dtype('float64')

给一个Numpy中文手册的连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值