Numpy指南:解锁Python多维数组与矩阵运算(中)

前言

numpy是Python中一个重要的库,它提供了高性能的数值计算和科学计算的支持。numpy库中最重要的特点之一是ndarray(N-dimensional array)对象,它是一个多维数组对象,可以有效地处理大规模的数据集合。同时,numpy还提供了一系列对数组进行切片、矩阵计算、生成随机数、进行统计分析的函数和方法。

一、数组切片索引

1.1 ndarray 数组索引和切片

在程序中,通常需要访问或者修改 ndarray 数组某个位置或区域的元素,也就是要用到 ndarray 数组的索引和切片

索引和切片的使用方式与Python中的 字符串、列表、元组 类似,索引号从 0 开始

设置 start, endstep 参数,从原数组中切割出一个新数组

1.1.1 一维数组(向量)的索引和切片

一维数组的 索引 与 列表 索引功能相似

import numpy as np
a = np.arange(1,15,2)
print (a)
print (a[4])
b = a [2:5]

将一个标量值赋值给一个切片时,该值会自动传播到整个选区(切片区)

>>> import numpy as np
>>> a = np.arange(10)
>>> a[4:7] = 10
[0 1 2 3 4 10 10 10 7 8 9]

转换为数组:

import numpy as np
a = [0,1,2,3,4,5,6,7,8,9]
a = np.array (a)
a [4:7] = 10

1.1.2 二维数组的索引和切片

import numpy as np
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print (a)

a[行号 ,列号] ——> a[r1:r2 , c1:c2]

  • [:] 代表某个维度的数据
  • a [1,1] 等价 a [1][1]

每个维度看成一个列表,然后用列表的切片操作就可以了

第一个参数如果什么都不写,就代表所有

>>> import numpy as np
>>> a = np.arange(12)
>>> arr3d = a.reshape(3, 2, 2)
>>> print (arr3d)
[[[0 1]
 [2 3]]
[[4 5]
[6 7]]
[[8 9]
[10 11]]]
>>> print (arr3d[1])
[[4 5]
[6 7]]
>>> print (arr3d[2,1])
[10 11]

reshape (3, 2, 2)表示有3个 2x2矩阵

在多维数组中,如果省略了后面的索引,则返回对象会是一个纬度低一点的 ndarray,只有一个索引指标时,会在第0维上索引,后面的维度保持不变。

二、矩阵计算及过滤

Numpy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。其中包括:

  • dot 矩阵乘法
  • det 计算矩阵行列式
  • eig 计算矩阵的特征值和特征向量
  • inv 计算矩阵的逆
  • diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)

常用的numpy.linalg函数:

2.1 矩阵相乘

矩阵的乘法分为常规乘法和矩阵乘法:

**常规相乘:**就是把有相同的行和列的数组,其对应位置的值进行乘法运算,结果为有同样行和列的数组

A * B

矩阵相乘 np.dot 方法:如果两个同时都是1维的数组相乘,运算过程相当于在空间意义上计算向量的内积

如果两个同时都是2维以上的数组相乘,运算过程相当于两个矩阵进行相乘

矩阵相乘(matrix product):A.dot(B),还可以写成:np.dot(A,B)

import numpy as np
A = np.array ([[1,3],[2,1]])
B = np.array ([[4,2],[1,4]])
C = A * B
D = A.dot(B)
print (C)
Print (D)

两个向量点积(内积)运算其实也是矩阵相乘,需要保证两个向量的元素个数相同,结果是一个数值类型的数

import numpy as np
x = np.array([1,2,3])
y = np.array([4,5,6])
z = np.dot(x,y)

2.1.1 向量与矩阵相乘

import numpy as np
x = np.array([1,0])
y = np.array([[1,2,3],[4,5,6]])
z = np.dot(x,y)

2.1.2 矩阵转置运算

transpose () 运算

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print (a)
b = a. transpose ()
# b = a.T
print (b)

2.1.3 求逆矩阵

numpy.linalg (linear algebra)模块包含线性代数的函数。使用这个模块,可以计算矩阵逆、特征值、解线性方程组以及求解行列式等

import numpy as np
A = np.array([[-1,0,2,1],[0,3,0,-3], [0,-1,1,0],[2,4,0,2]])
invA = np.linalg.inv(A)
print (A)
print (invA)

2.2 过滤

import numpy as np
n = np.array([1,2,4,7,3,9,10,34,31])
n1 = n.reshape(3,3)
print (n1)

需要取出数组中值大于 7 的的数据?

>>> print (n1[n1>7])
[ 9 10 34 31]

矢量和标量运算,“广播”— 将标量“广播”到各个元素。

>>> import numpy as np
>>> n = np.array([1,2,4,7,3,9,10,34,31])
>>> n1 = n.reshape(3,3)
>>> print (n1)
>>> n1>7

2.3 条件筛选函数:numpy.where()

语法numpy.where(condition, [x, y])

  • np.where(condition)

    # 返回元素值大于 5 的索引号
    import numpy as np
    a = np.array([6,4,9,3,10])
    np.where(a > 5)
    # 返回元素值大于 5 的值
    import numpy as np
    a = np.array([6,4,9,3,10])
    a[np.where(a > 5)
    
    • np.where(condition, x, y)

      如果条件为真,则产生 x,否则产生 y

      # 满足条件输出 1,不满足输出 0
      >>> import numpy as np
      >>> a = np.array([6,4,9,3,10])
      >>> a = np.where(a > 5,1,0)
      array([1, 0, 1, 0, 1])
      

2.4 clip 裁剪函数

numpy 中的 clip 裁剪函数用法:

numpy.clip(a, a_min, a_max)

>>> import numpy as np
>>> a = np.arange(20).reshape(4,5)
>>> b = np.clip(a,5,10)
[[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
>>> a = np.arange(20).reshape(4,5)
>>> a.clip(5,10)
[[5 5 5 5 5]
[5 6 7 8 9]
[10 10 10 10 10]
[10 10 10 10 10]]

2.5 对数函数

三、随机数种子

3.1 随机数生成

import numpy as np
a = np.random.uniform (0,100)
print (a)

在numpy里可以设置随机数种子(seed),以防止每次生成的随机数不一样

import numpy as np
np.random.seed(1)
a = np.random.uniform (0,100)
print (a)

设置种子的主要目的是为了确保每次运行代码时生成的随机数序列是相同的。这对于调试、测试和复现实验结果非常重要

  • 调试和测试:在开发和测试过程中,通过设置固定的种子,你可以确保每次运行代码时生成的随机数序列是相同的,从而更容易地定位和解决问题
  • 复现实验结果:通过设置固定的种子,可以确保其他人使用相同的代码和数据时能够得到相同的结果。这对于验证实验的有效性和可重复性至关重要
  • 比较算法性能:通过设置固定的种子,可以确保每次演示时生成的随机数和结果是一致的

3.2 随机打乱ndarray数组顺序

>>> import numpy as np
>>> a = np.arange(0, 10)
>>> print (a)
[0 1 2 3 4 5 6 7 8 9]
>>> np.random.shuffle(a)
>>> print (a)
[7 8 3 5 6 2 4 0 1 9]

对于二维数组

import numpy as np
a = np.arange(15)
b = a.reshape(3,5)
print (b)
np.random.shuffle(b)
print (b)

随机打乱一维数组顺序时,所有元素位置都改变了,但在随机打乱二维数组顺序时,发现只有行的顺序被打乱了,列保持不变

3.3 随机选取一部分元素

>>> import numpy as np
>>> a = np.arange(10)
>>> print (a)
[0 1 2 3 4 5 6 7 8 9]
>>> b = np.random.choice(a, size = 5)
>>> print (b)
[7 3 6 1 6]

四、统计计算

4.1 常用统计方法

  • arr.mean(), np.mean(arr) 等价
  • arr.sum(), np.sum(arr) 等价
  • arr.max(),np.max(arr),arr.min(), np.min(arr)
  • arr.std(), arr.var() 标准差、方差
  • arr.argmin(), arr.argmax() 最小索引、最大索引
  • arr.cumsum(), arr.cumprod() 所有元素的累计和、累计积

注意: 多维数组要指定统计的维度,否则默认是全部维度上做统计

4.2 指定计算的维度,求平均数、求和

mean、max、min 和 sum 这类的函数不一定对整个数组进行操作,也可以接受一个 axis 参数(用于计算该轴上的统计值)

4.2.1 求平均数:mean

>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6]])
>>> mean_row = a.mean(axis = 1)
>>> print (mean_row)
[2. 5.]
>>> mean_column = a.mean(axis = 0)
>>> print (mean_column)
[2.5 3.5 4.5]

4.2.2 求和:sum

>>> import numpy as np
>>> a = np.arange(12).reshape(3,4)
>>> print (a)
[[0 1 2 3]
[4 5 6 7]
[8 9 10 11]]
>>> np.sum(a)
66
>>> np.sum(a,axis=0)
[12 15 18 21]
>>> np.sum(a,axis=1)
[6 22 38]

4.2.3 找出最大元素

>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6]])
>>> print (a)
>>> max1 = a.max(axis = 0)
>>> print ('axis = 0:',max1)
axis = 0: [4 5 6]
>>> max2 = a.max(axis = 1)
>>> print ('axis = 1:',max2)
axis = 1: [3 6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值