numpy库入门

作者: xin激流勇进 | 来源:发表于2018-01-21 15:12 被阅读0次
image.png

NumPy

NumPy是一个开源的Python科学计算基础库,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合C/C++/Fortran代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy是SciPy、Pandas等数据处理或科学计算库的基础
[图片上传中...(image.png-7ce6da-1516518752105-0)]

NumPy的引用
import numpy as np

N维数组对象:ndarray

image.png

Python已有列表类型,为什么需要一个数组对象(类型)?

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

观察:科学计算中,一个维度所有数据的类型往往相同

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

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

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

ndarray对象的属性

轴(axis): 保存数据的维度;秩(rank):轴的数量

属性 说明
.ndim 秩,即轴的数量或维度的数量
.shape ndarray对象的尺度,对于矩阵,n行m列
.size ndarray对象元素的个数,相当于.shape中n*m的值
.dtype ndarray对象的元素类型
.itemsize ndarray对象中每个元素的大小,以字节为单位
>>> import numpy as np
>>> a = np.array([[0, 1, 2, 3, 4],
          [9, 8, 7, 6, 5]])
>>> a.ndim
2
>>> a.shape
(2, 5)
>>> a.size
10
>>> a.dtype
dtype('int32')
>>> a.itemsize
4 

ndarray数组的元素类型

数据类型 说明
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数,取值:[‐128, 127]
int16 16位长度的整数,取值:[‐32768, 32767]
int32 32位长度的整数,取值:[‐2的31次方 , 2的 31次方 ‐1]
int64 64位长度的整数,取值:[‐2的63次方 , 2的 63次方 ‐1]
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 2 32 ‐1]
uint64 32位无符号整数,取值:[0, 2 64 ‐1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数
complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数

对比:Python语法仅支持整数、浮点数和复数3种类型
ndarray为什么要支持这么多种元素类型?

  • 科学计算涉及数据较多,对存储和性能都有较高要求
  • 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
  • 对元素类型精细定义,有助于程序员对程序规模有合理评估

非同质的ndarray对象

>>> x = np.array([[0, 1, 2, 3,4],
          [9, 8, 7, 6]])
>>> x.shape     ndarray数组可以由非同质对象构成
(2,)
>>> x.dtype
dtype('O')
>>> x         非同质ndarray元素为对象类型
array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object)
>>> x.itemsize 
8
>>> x.size       非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用
2

ndarray数组的创建方法

(1) 从Python中的列表、元组等类型创建ndarray数组

>>> x = np.array([0,1,2,3])
>>> print(x)
[0 1 2 3]
>>> x = np.array((4,5,6,7))
>>> print(x)
[4 5 6 7]
>>> x = np.array([[1,2],[9,8],(0.1,0.2)])
>>> print(x)
[[ 1.   2. ]
 [ 9.   8. ]
 [ 0.1  0.2]]

(2)使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等

函数 说明
np.arange(n) 类似range()函数,返回ndarray类型,元素从0到n‐1
np.ones(shape) 根据shape生成一个全1数组,shape是元组类型
np.zeros(shape) 根据shape生成一个全0数组,shape是元组类型
np.full(shape,val) 根据shape生成一个数组,每个元素值都是val
np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a) 根据数组a的形状生成一个全1数组
np.zeros_like(a) 根据数组a的形状生成一个全0数组
np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val
np.linspace() 根据起止数据等间距地填充数据,形成数组
np.concatenate() 将两个或多个数组合并成一个新的数组
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.ones((3,6))
array([[ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.]])
>>> np.zeros((3,6),dtype=np.int32)
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])
>>> np.eye(5)
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])
>>> np.ones((2,3))
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> a = np.linspace(1,10,4)
>>> a
array([  1.,   4.,   7.,  10.])
>>> b = np.linspace(1,10,4,endpoint=False)
>>> b
array([ 1.  ,  3.25,  5.5 ,  7.75])
>>> c = np.concatenate((a,b))
>>> c
array([  1.  ,   4.  ,   7.  ,  10.  ,   1.  ,   3.25,   5.5 ,   7.75])
>>> 

ndarray数组的变换

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

ndarray数组的维度变换

方法 说明
.reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape) 与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2) 将数组n个维度中两个维度进行调换
.flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
>>> import numpy as np
>>> a = np.ones((2,3,4),dtype=np.int32)
>>> 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]]])
>>> 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]])
>>> 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])
>>> a
array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],

ndarray数组的类型变换
new_a = a.astype(new_type)
astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致

>>> a = np.ones((2,3,4),dtype=np.int)
>>> 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]]])
>>> b = a.astype(np.float)
>>> b
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.]]])

ndarray数组向列表的转换
ls = a.tolist()

>>> a = np.full((2,3,4),25,dtype=np.int32)
>>> a
array([[[25, 25, 25, 25],
        [25, 25, 25, 25],
        [25, 25, 25, 25]],

       [[25, 25, 25, 25],
        [25, 25, 25, 25],
        [25, 25, 25, 25]]])
>>> a.tolist()
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]], [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

ndarray数组的操作

数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与Python的列表类似

>>> a = np.array([9,8,7,6,5])
>>> a[2]
7
>>> a[1:4:2]
array([8, 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[-1,-2,3]
19

多维数组的切片:

>>> 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,-3]
array([ 5, 17])
>>> 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.        ]]])

NumPy一元函数
对ndarray中的数据执行元素级运算的函数

函数 说明
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(‐)
>>> a = np.arange(24).reshape((2,3,4))
>>> np.square(a)
array([[[  0,   1,   4,   9],
        [ 16,  25,  36,  49],
        [ 64,  81, 100, 121]],

       [[144, 169, 196, 225],
        [256, 289, 324, 361],
        [400, 441, 484, 529]]], dtype=int32)
>>> np.modf(a)
(array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]]), 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.]]]))

NumPy二元函数

函数 说明
+ ‐ * / ** 两个数组各元素进行对应运算
np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() 元素级的最大值/最小值计算
np.mod(x,y) 元素级的模运算
np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素
> < >= <= == != 算术比较,产生布尔型数组
>>> 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]]])
>>> b = np.sqrt(a)
>>> b
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]]])
>>> np.maximum(a,b)
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>b
array([[[False, False,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]],

       [[ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]]], dtype=bool)
>>> 

相关文章

  • NumPy库入门

    维度: 一组数据的组织形式 一维数据: 对应列表,数组和集合等概念(线性方式组织) 列表: 数据类型可以不同数组:...

  • numpy库入门

    NumPy NumPy是一个开源的Python科学计算基础库,包含: 一个强大的N维数组对象 ndarray 广播...

  • 机器学习实战入门准备工作

    这里机器学习采用的是python2.7.13版本,安装了numpy库,和matplotlib库。入门工作主要分为三...

  • 看图学NumPy:掌握n维数组基础知识点,看这一篇就够了

    摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy...

  • python数据处理

    一、Numpy库入门 ndarray对象的属性.ndim 秩,即轴的数量或维度的数量.shape ndarray对...

  • Numpy简易入门笔记

    来自 AI基础:Numpy简易入门手动运行了一遍实例代码,笔记待查于此处。 Numpy 简易入门 Numpy是 N...

  • python——numpy库入门(1)

    如果对VBA的数组有略微了解,那么对numpy会有相应的帮助,记得半年前看VBA数组,完全不理解,它还是有些抽象的...

  • python——numpy库入门(2)

    花式索引 它是指利用整数数组进行索引。 为了以特定顺序选取行子集,只需要传入一个用于指定顺序的整数列表或者ndar...

  • python——numpy库入门(3)

    数组转置和轴对换 转置是重塑的一种特殊形式,它返回的是源数据的视图,不会进行复制操作。它有transpose方法和...

  • 图片转numpy数组和numpy数组转图片

    图片转numpy数组 基于PIL库 numpy数组转图片 基于PIL库

网友评论

    本文标题:numpy库入门

    本文链接:https://www.haomeiwen.com/subject/fzazoxtx.html