Python 学习 08:NumPy

NumPy is a library for the Python programming language, adding support for large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays.



一、多维数组 ndarray


NumPy 主要由多维数组 ndarray (一个用来储存同一种数据类型的有序容器), 和用来操纵 ndarry 的函数组成. ndarrayNumPy 核心概念

ndarray 中的元素的可以是整数, 浮点数, 固定长度的字符串, 等等, 还可以是任何 Python 对象的 reference (并不储存对象本身) 这些元素称为标量 scalar

ndarrays 是同质的:即其所有元素在内存中占据了同样的大小,每一个元素的数据类型对象dtype是一样的

ndarray 中的元素可以用整数(位置)来索引,这和 list 很像, 但 ndarray 可以是多维的 (有多个轴 axis)

一个 ndarray 在计算机内存中由两个部分组成:

  1. 组成了 ndarrayscalar
  2. ndarray 的头文件, 定义了数组中 scalar 唯一的数据类型


二、数据类型


ndarray 中的元素的可以是整数,浮点数,字符串,等等,还可以是任何 Python 对象的 reference (并不储存对象本身)。与数组对应,这些元素统称为标量 scalar

以下是这些标量的数据类型对象之间的继承关系:

对象类型 np.object_

  1. object_ : 任何 Python 对象的 reference ,而非对象本身。但是在使用时会返回这个对象本身

数字类型 np.number

  1. bool_ : 布尔型数据类型(True 或者 False)
  2. int_ : 默认的整数类型(类似于 C 语言中的 longint32int64
  3. intc : 与 C 的 int 类型一样,一般是 int32int64
  4. intp : 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32int64
  5. int8 : 字节(-128 to 127)
  6. int16 : 整数(-32768 to 32767)
  7. int32 : 整数(-2147483648 to 2147483647)
  8. int64 : 整数(-9223372036854775808 to 9223372036854775807)
  9. uint8 : 无符号整数(0 to 255)
  10. uint16 : 无符号整数(0 to 65535)
  11. uint32 : 无符号整数(0 to 4294967295)
  12. uint64 : 无符号整数(0 to 18446744073709551615)
  13. float_ : float64 类型的简写
  14. float16 : 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
  15. float32 : 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
  16. float64 : 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
  17. complex_ : complex128 类型的简写,即 128 位复数
  18. complex64 : 复数,表示双 32 位浮点数(实数部分和虚数部分)
  19. complex128 : 复数,表示双 64 位浮点数(实数部分和虚数部分)

字符类型 np.character

  1. str_ : 字符串
  2. unicode_ : unicode 字符串,默认是 UTF8,支持中文

它们的方法和属性与 Python 原生的 str 一致

有些标量的数据类型对象 dtypePython 中的基本数据类型对象 int, float, str, bool 概念上是一样的,两者也可以很容易地互相转换和比较数值大小,但是他们是不同的对象



三、索引与切片


numpy 保留了 Python 中索引与切片的操作,并且可以针对多维数组

索引会返回一个 scalar,切片会返回一个 ndarray



3.1 多维索引

不同维度之间用“,”隔开。


3.2 更新 ndarray

只需对该 ndarray 做索引,并对结果“赋值”。可以使用一个 scalar 更新,也可以使用另一个 ndarray 更新,但需要注意 shapedtype 是否匹配



3.3 索引进阶

3.3.1 整数数组索引

使用一个整数数组(list, tuplendarray)来切割

3.3.2 条件索引

使用逻辑表达式来筛选数组中的元素

import numpy as np

x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9,10,11]])
print('我们的数组是:')
print(x)
print('大于 5 的元素是:')
print(x[x >  5])

3.3.3 一些条件筛选函数

  1. np.argmax(), np.argmin() : 返回沿给定轴最大和最小元素的索引

  2. np.nonzero() : 返回输入数组中非零元素的索引

  3. np.where() : 返回输入数组中满足给定条件的元素的索引

  4. np.extract() : 根据某个条件从数组中抽取元素,返回满条件的元素



四、数组的维度与轴 Axis


ndarray 的维度 ndim 即指明了其轴的数量。0 轴定义为“最里面”的那个一维数组。



4.1 改变 ndarray 的形状

通过 .reshape() 方法可以改变数组的形状。



4.2 加轴

np.newaxis : 在使用这句话的位置增加一条轴

import numpy as np

a = np.zeros(10)
b = a[:, np.newaxis]
print(b)
c = a[np.newaxis, :]
print(c)

五、广播


当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

广播的规则:

  1. 输出数组的形状是输入数组形状的各个维度上的最大值

  2. 输入数组的每个轴和输出数组的对应轴的长度相同, 或者该轴长度为 1

  3. 输入数组若维度低于输出数组,那么在该数组的形状前加1直至补齐

  4. 输入数组若某轴的长度为1,则沿着此轴运算时都用此轴上的第一组值



六、随机数


  1. np.random.rand(d0, d1, d2) : 从 uniform 分布中抽出形状为 (d0, d1, d2) 的样本数组,形状为空则返回标量

  2. np.random.randn(d0, d1, d2) : 从标准正态分布中抽出形状为 (d0, d1, d2) 的样本数组,形状为空则返回标量

  3. np.random.RandomState() : 固定随机状态允许我们复现某一次随机过程的结果。实例化一个 RandomState 对象, 此后我们可以用这个对象替代 np.random 来调用 np.random 下的函数, 比如 np.random.rand



七、常用方法


  1. np.unique() : 不重复元素

  2. np.sort() : 排序

  3. np.argsort() : 按照元素值的大小将索引排序

  4. np.bincount() : 自然数数组中各元素的频次

  5. .T : 转置

  6. np.linalg.inv() : 求逆矩阵,np.linalg.pinv() 是求伪逆





同步更新于:SP-FA 的博客


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SP FA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值