NumPy基础知识

1. 介绍

NumPy的核心是多维数组类numpy.ndarray,矩阵类numpy.matrix是多位数组类的派生类。以多位数组类为数据组织结构,Numpy提供了众多的数学、科学和工函数,此外,NumPy还提供了以下多个子模块

子模块名 功能
numpy.random 随机抽样子模块
numpy.linalg 线性代数子模块
numpy.fft 傅里叶变换子模块
numpy.ctypeslib C-Types外部函数接口子模块
numpy.emath 具有自动域的数学函数子模块
numpy.testing 测试支持子模块
numpy.matlib 矩阵库子模块
numpy.dual Scipy加速支持子模块
numpy.distutils 打包模块

2. 安装和导入

pip install numpy
import numpy as np

3. 数组和列表的比较

  • 列表
    • 元素类型不受限制。同一个列表内,列表元素可以是不同的数据类型,甚至可以是函数
    • 元素可以动态增减。例:append()insert()pop()remove()
  • 数组
    • 数组元组必须具有相同的的数据类型
    • 数组一旦创建,其元素数量就不能再改变了

4. 数组的数据类型

Numpy支持的数据类型主要有整形(integer)、浮点型(float)、布尔型(bool)和复数型(complex),每一种数据类型根据占用内存的字节数又分为多个不同的类型,具体的数据类型如图所示。Numpy也支持字符串类型和自定义类型的数据,但绝大多数函数和方法不适用于非数值型数组

  • 整型:np.int8np.int16np.int32np.int64
  • 无符号整型:np.uint8np.uint16np.uint32np.uint64
  • 浮点型:np.float16np.float32np.float64
  • 布尔型:np.bool
  • 复数型:np.complex64np.complex128

创建数组时,如果不指定数据类型,Numpy会根据输入的参数自动选择合适的数据类型。通常在指定数据类型的时候,可以省略类型后面的数字。如果省略数字,整型和无符号整形默认是32位,浮点型默认是64位,复数型默认是128位

import numpy as np

a = np.array([0, 1, 2])
print(a.dtype)
b = np.array([0, 1, 2.0])
print(b.dtype)
c = np.array([0, 1, 2], dtype=np.uint8)
print(c.dtype)

5. 数组的属性

属性 说明
ndarray 数组的数据类型
ndarray.shape 数组的结构,也可以理解为数组的形状
ndarray.size 数组的元素个数
ndarray.itemsize 每个元素占用内存的大小,以字节为单位
ndarray.ndim 数组的维度数,也叫秩
ndarray.flags 数组的内存信息
ndarray.real 数组实部
ndarray.imag 数组虚部
ndarray.data 数组在内存中实际存储区域的起始地址
import numpy as np

a = np.arange(6)
print(a)
print(a.shape)
print(a.dtype)

# 改变数组结构
b = a.reshape((2, 3))
print(b)
# 改变数据类型
c = b.astype(np.float)
print(c.dtype)

6. 维、秩、轴

维,就是维度。通常说数组是几维的,就是指维度数,如三维数组的维度数就是3。维度数还有一个专用名字,叫秩,也就是数组属性ndim。一维数组,类比于一维空间,只有一个轴,那就是0轴。二维数组,类比于二维空间,有两个轴,习惯表示成行和列,行的方向是0轴,列的方向是1轴。三维数组,类比于三维空间,有三个轴,习惯表示成层、行和列,层的方向是0轴,行的方向是1轴,列的方向是2轴

import numpy as np

# 3层2行3列的结构
a = np.arange(18).reshape((3, 2, 3))
print(a)
# 全部元素之和
print(a.sum())
# 0轴方向求和:3层合并成1层,返回二维数组
print(a.sum(axis=0))
# 1轴方向求和:2行合并成1行,返回二维数组
print(a.sum(axis=1))
# 2轴方向求和:3列合并成1列,返回二维数组
print(a.sum(axis=2))
# 分层求和方法1
print(a.sum(axis=1).sum(axis=1))
# 分层求和方法2
print(a.sum(axis=2).sum(axis=1))

7. 广播和矢量化

  • Numpy处理速度远高于Python的原因:广播和矢量化
  • 广播:隐式的对每个元素实施操作
  • 矢量化:代码中没有显式的循环、索引等

要求:数值型数组的各个元素加1

import numpy as np

# 列表实现
a = [0, 1, 2, 3, 4]
for i in range(len(a)):
    a[i] += 1
print(a)

# numpy实现
b = np.array([0, 1, 2, 3, 4])
b += 1
print(b)

要求:两个等长的数值型数组的对应元素相加

import numpy as np

# 列表实现
a = [0, 1, 2, 3, 4]
b = [5, 6, 7, 8, 9]
print([i+j for i, j in zip(a, b)])

# numpy实现
a = np.array([0, 1, 2, 3, 4])
b = np.array([5, 6, 7, 8, 9])
print(a+b)

你可能感兴趣的:(Water,numpy,python)