理解numpy的rollaxis与swapaxes函数

在理解这两个函数之前,首先要理解numpy数组的轴

轴(axis)是数组中维的标志,用维来解释的话过于抽象了,我们可以通过一个实例来说明

假设我有一张学生成绩表,成绩表是按座位排列,成绩表如下

7834872583
2567972213
7843874589

那么这张表的横轴就是就是排,竖轴就是列,我们可以算哪一排或者哪一列的平均分或者最高分,就是指定轴做运算,我们给把张表当成一个二维数组并加上数组下标,变成下表:[[78,34,87,25,83],[25,67,97,22,13],[78,43,87,45,89]]

78(00)34(01)87(02)25(03)83(04)
25(10)67(11)97(12)22(13)13(14)
78(20)43(21)87(22)45(23)89(24)
运行代码求最大值
import numpy as np
a = np.array([[78, 34, 87, 25, 83], [25, 67, 97, 22, 13], [78, 43, 87, 45, 89]])
print(a.max(axis=0))
print(a.max(axis=1))

打印

[78 67 97 45 89]
[87 97 89]

从这里可以看到axis=0就是竖轴的数据,第一行打印出了每列的最大值,axis=1就是横轴的

下面我们再使用一个2X2的三维数组:[[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

0(000)1(001)
2(010)3(011)
4(100)5(101)
6(110)7(111)
运行代码:
import numpy as np
a = np.array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]])
print(a.max(axis=0))
print('\n')
print(a.max(axis=1))
print('\n')
print(a.max(axis=2))
打印内容:
[[4 5]
 [6 7]]

[[2 3]
 [6 7]]

[[1 3]
 [5 7]]

这里的最大值就是把一个一维数组当成了一个元素

当axis为0和1时,和二维数组同理

重点关注axis=2时,这时为了匹配数组第三个下标相同的为一组,一维数组中的内容发生了改变:

[0(000),2(010)][1(001),3(011)]
[4(100),6(110)][5(101),7(111)]

可以看出多维数组的axis是与数组下标相关的

现在再说rollaxis函数,这个函数有三个参数 

numpy.rollaxis(arr, axis, start)

arr:输入数组
axis:要向后滚动的轴,其它轴的相对位置不会改变
start:默认为零,表示完整的滚动。会滚动到特定位置

运行代码:

import numpy as np

a = np.arange(8).reshape(2, 2, 2)

print '原数组:'
print a
print '\n'
# 将轴 2 滚动到轴 0(宽度到深度)

print '调用 rollaxis 函数:'
print np.rollaxis(a, 2)
# 将轴 0 滚动到轴 1:(宽度到高度)
print '\n'

print '调用 rollaxis 函数:'
print np.rollaxis(a, 2, 1)

打印:

原数组:
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]


调用 rollaxis 函数:
[[[0 2]
  [4 6]]

 [[1 3]
  [5 7]]]


调用 rollaxis 函数:
[[[0 2]
  [1 3]]

 [[4 6]
  [5 7]]]

程序运行np.rollaxis(a, 2)时,讲轴2滚动到了轴0前面,其他轴相对2轴位置不变(start默认0),数组下标排序由0,1,2变成了1,2,0

这时数组按下标顺序重组,例如第一个数组中[0,1]下标为[000,001],其中0的下标变动不影响值,1位置的下标由001变成010,第一位的下标滚动到最后一位下标的后面,值由1(001)变成2(010):

0(000) -> 0(000)1(001) -> 2(010)
2(010) -> 4(100)3(011) -> 6(110)
4(100) -> 1(001)5(101) -> 3(011)
6(110) -> 5(101)7(111) -> 7(111)

可以得出轴的滚动就是下标的滚动,同理,运行np.rollaxis(a, 2, 1)时将下标0,1,2变为0,2,

numpy.swapaxes(arr, axis1, axis2)函数则是交换,将axis1和axis2进行互换

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
NumPy和SciPy都是Python中非常流行的科学计算库,二者在很多方面都有重叠的功能,但它们的设计目标不同。NumPy主要用于数组操作,而SciPy则提供了更广泛的科学计算功能,包括线性代数、数值积分、优化、信号处理、图像处理、稀疏矩阵等等。下面是NumPy和SciPy计算函数的对比: 1. 数组操作 NumPy的核心是ndarray( n-dimensional array),它提供了大量的数组操作函数,包括数组的创建、索引、切片、变形、合并、分割、排序、搜索等等。而SciPy则扩展了NumPy的数组操作,提供了更多的高级数组操作函数,如广播、数组迭代、矩阵计算等等。 2. 线性代数 NumPy提供了线性代数模块linalg,包含了矩阵分解、求逆、行列式、特征值与特征向量、矩阵求解等基本操作。而SciPy则在此基础上,提供了更多的高级线性代数函数,如奇异值分解(SVD)、QR分解、LU分解、乔里斯基分解、广义逆等等。 3. 数值积分 SciPy提供了数值积分模块integrate,包含了数值积分、常微分方程求解、符号积分等等。而NumPy则没有这些功能。 4. 优化 SciPy提供了优化模块optimize,包含了各种优化算法,如线性规划、非线性规划、最小二乘、曲线拟合等等。而NumPy则没有这些功能。 5. 信号处理和图像处理 SciPy提供了信号处理模块signal和图像处理模块ndimage,包含了各种信号处理和图像处理函数。而NumPy则没有这些功能。 6. 稀疏矩阵 SciPy提供了稀疏矩阵模块sparse,包含了各种稀疏矩阵的创建、操作和计算函数。而NumPy则没有这些功能。 总的来说,NumPy主要用于数组操作,而SciPy则提供了更广泛的科学计算功能,包括线性代数、数值积分、优化、信号处理、图像处理、稀疏矩阵等等。在实际使用中,我们可以根据需要选择使用NumPy或者SciPy,或者同时使用二者。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值