np.transpose

最近看代码的时候,老是出现np.transpose()这个用法,但是对其中的原理还是不甚了解,今天就来总结一下,以及这个用法对图像的结果及效果。

è¿éåå¾çæè¿°

参数 a:输入数组 
axis: int类型的列表,这个参数是可选的。默认情况下,反转的输入数组的维度,当给定这个参数时,按照这个参数所定的值进行数组变换。 
返回值 p:ndarray 返回转置过后的原数组的视图。

给大家举个例子。

对于一维数组:

>>> import numpy as np
>>> t=np.arange(4)
>>> t
array([0, 1, 2, 3])
>>> t.transpose()
array([0, 1, 2, 3])
>>> 

由上可见,对于一维数组而言,numpy.transpose()是不起作用的。

  1. 对于二位数组:
>>> two=np.arange(16).reshape(4,4)
>>> two
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> two.transpose()
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
>>> two.transpose(1,0)
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])

有以上可见,原数组two的数组两个轴为(x,y),对应的下标为(0,1),np.transpose()传入的参数为(1,0),即将原数组的x,y轴互换。综上,对二维数组的transpose操作就是对原数组的转置操作。

  1. 对于三维数组:先看一个例子。

 

>>> three=np.arange(18).reshape(2,3,3)
>>> three
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])
>>> three.transpose()
array([[[ 0,  9],
        [ 3, 12],
        [ 6, 15]],

       [[ 1, 10],
        [ 4, 13],
        [ 7, 16]],

       [[ 2, 11],
        [ 5, 14],
        [ 8, 17]]])
>>> 

 这是numpy.transpose()函数对three数组默认的操作,即将原数组的各个axis进行reverse一下,three原始axis排列为(0,1,2),那numpy.transpose()默认的参数为(2,1,0)得到转置后的数组的视图,不影响原数组的内容以及大小。 
我们一步一步来分析这个过程:axis(0,1,2)———>axis(2,1,0) ,transpose后的数组相对于原数组来说,相当于交换了原数组的0轴和2轴。

#对原始three数组的下标写出来,如下:
A=[
       [ [ (0,0,0) , (0,0,1) , (0,0,2)],
       [ (0,1,0) , (0,1,1) , (0,1,2)],
       [ (0,2,0) , (0,2,1) , (0,2,2)]],

       [[ (1,0,0) , (1,0,1) , (1,0,2)],
        [ (1,1,0) , (1,1,1) , (1,1,2)],
        [ (1,2,0) , (1,2,1) , (1,2,2)]]
  ]

#接着把上述每个三元组的第一个数和第三个数进行交换,得到以下的数组

B=[[[ (0,0,0) , (1,0,0) , (2,0,0)],
  [ (0,1,0) , (1,1,0) , (2,1,0)],
  [ (0,2,0) , (1,2,0) , (2,2,0)]],

  [[ (0,0,1) , (1,0,1) , (2,0,1)],
  [ (0,1,1) , (1,1,1) , (2,1,1)],
  [ (0,2,1) , (1,2,1) , (2,2,1)]]]

#最后在原数组中把B对应的下标的元素,写到相应的位置
#对比看一下,这是原数组
[[[ 0,  1,  2],
  [ 3,  4,  5],
  [ 6,  7,  8]],

  [[ 9, 10, 11],
   [12, 13, 14],
   [15, 16, 17]]]
# 按照B的映射关系得到最终的数组。
C=[[[ 0,  9],
  [ 3,  12],
  [ 6,  15]],

  [[ 1, 10],
   [4, 13],
   [7, 16]]

   [[ 2, 11],
   [5, 14],
   [8, 17]]
]
# 最终的结果也就是数组C

那么我们知道了旋转的矩阵结果,那么在深度学习中为什么要这么旋转图片矩阵,以及这样做的意义及效果又是什么?


--------------------- 
作者:cool whidpers 
来源:优快云 
原文:https://blog.youkuaiyun.com/xiongchengluo1129/article/details/79017142 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

<think>首先,用户的问题是关于NumPy的np.array反序操作。他们提到“反序操作”,在引用中看到了一些例子,比如使用[:,::-1]来横向反序和[::-1,:]来列向反序。用户还提到了其他引用,但核心是反序操作。 用户的关键问题是:“我想查找使用np.array进行反序操作的方法 请问numpy的np.array反序操作方法”。所以,我需要提供如何使用NumPy的反序操作方法。 从引用中提取关键信息: - 引用[1]:展示了使用切片来实现横向和列向反序。具体: - 横向反序(第二个维度):a[:,::-1] - 列向反序(第一个维度):a[::-1,:] - 引用[2]和[3]:讨论了转置(.T属性),但用户明确问的是反序(reversal),不是转置。虽然转置改变了顺序,但反序通常是翻转顺序。 - 引用[4]:关于通用函数,不直接相关。 - 引用[5]:关于transpose函数,类似于转置。 用户已经看到了反序的例子在引用[1],所以我应该基于那个构建我的回答。引用[1]显示了如何实现横向和列向反序。 我的回答需要遵循系统级指令: - 所有行内数学表达式用$...$,但这里可能不涉及数学表达式,因为是编程问题。 - 独立公式用$$...$$单独成段。 - LaTeX语法正确:使用$...$或$$...$$。 - 使用中文回答。 - 生成相关问题:在回答末尾添加相关问题。 - 回答中引用的段落末尾添加引用标识:例如[^1],因为用户提供了引用。 用户说“上述引用仅供参考”,所以我应该参考这些引用,但不限于此。我需要确保回答真实可靠。 结构化回答: 1. **解释反序操作**:简要说明NumPy中反序的含义。 2. **展示方法**:使用切片操作来实现反序。 - 横向反序(行反序?):a[:,::-1] - 列向反序(列反序?):a[::-1,:] - 引用[1]有具体例子。 3. **提供示例代码**:既然是编程问题,最好给出代码示例。 4. **提及其他相关方法**:如np.flip()函数,可以更灵活地处理反序。 5. **引用标识**:在适当的地方添加[^1]等。 6. **相关问题**:结束时生成相关问题。 用户上一次的问题和回答:用户上一次的问题是“我想查找使用np.array进行反序操作的方法”,所以我正在回答这个。 完整回答结构: - 开头解释反序操作。 - 展示切片方法。 - 给出代码示例。 - 讨论np.flip()作为更便捷的选择。 - 结束时添加相关问题。 确保使用中文。 相关问题建议: 1. 如何反序多维数组? 2. NumPy中flip函数的用法是什么? 3. 反序操作在数据处理中的应用? 代码示例: 基于引用[1],我可以创建一个简单的例子。 </think>下面我将详细解释NumPy中`np.array`的反序操作方法。反序操作指的是将数组元素在指定维度上翻转顺序(例如,将一个序列从后往前排列)。在NumPy中,最常见的方法是使用**切片操作符**和**专用函数**如`np.flip()`。我将基于您提供的引用信息(尤其是引用[1]),并结合NumPy官方用法,逐步说明如何实现。所有示例代码都使用Python和NumPy库。 ### 1. **切片操作实现反序** NumPy数组支持Python的切片语法(`start:stop:step`),结合负步长(`step=-1`)可以高效实现反序操作。切片操作不修改原数组,而是创建一个新视图(view),因此内存开销很小。 - **横向反序(沿第二个维度,即列方向反转)**: 使用`array[:, ::-1]`,其中`::-1`表示在列方向上从后往前取元素。 **示例代码**: ```python import numpy as np a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) b = a[:, ::-1] # 横向反序 print("原数组:\n", a) print("横向反序后:\n", b) ``` 输出: ``` 原数组: [[1 2 3 4] [5 6 7 8]] 横向反序后: [[4 3 2 1] [8 7 6 5]] ``` 此方法在引用[1]中被明确提到用于横向反序[^1]。 - **列向反序(沿第一个维度,即行方向反转)**: 使用`array[::-1, :]`,其中`::-1`表示在行方向上从后往前取元素。 **示例代码**: ```python a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) b = a[::-1, :] # 列向反序 print("原数组:\n", a) print("列向反序后:\n", b) ``` 输出: ``` 原数组: [[1 2 3 4] [5 6 7 8]] 列向反序后: [[5 6 7 8] [1 2 3 4]] ``` 此方法同样在引用[1]中展示[^1]。 - **同时反序多个维度**: 组合切片,例如`array[::-1, ::-1]`会同时反转行和列。 **示例**: ```python b = a[::-1, ::-1] # 行和列同时反序 print(b) # 输出: [[8 7 6 5], [4 3 2 1]] ``` ### 2. **使用`np.flip()`函数实现更灵活的反序** NumPy提供了内置函数`np.flip(array, axis)`,它更直观且支持任意维度。`axis`参数指定反序的维度: - `axis=0`:列向反序(行方向)。 - `axis=1`:横向反序(列方向)。 - 对于多维数组,可以指定更高维度(如`axis=2`)。 **示例代码**: ```python a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) b = np.flip(a, axis=0) # 列向反序,等同于 a[::-1, :] c = np.flip(a, axis=1) # 横向反序,等同于 a[:, ::-1] d = np.flip(a) # 默认反序所有维度 print("列向反序:\n", b) print("横向反序:\n", c) print("所有维度反序:\n", d) ``` 输出: ``` 列向反序: [[5 6 7 8] [1 2 3 4]] 横向反序: [[4 3 2 1] [8 7 6 5]] 所有维度反序: [[8 7 6 5] [4 3 2 1]] ``` `np.flip()`在NumPy官方文档中推荐用于清晰性,因为它避免了切片语法的潜在混淆[^3]。 ### 3. **注意事项** - **性能与内存**:切片操作(如`[::-1]`)创建数组的视图(view),不复制数据,因此效率高(时间复杂度$O(1)$)。但`np.flip()`默认返回副本,需注意内存开销(可使用`copy=False`参数优化),这在处理大型数组时很重要。 - **转置(Transpose) vs 反序(Reversal)**: 引用[2][3]提到的`.T`或`np.transpose()`是转置操作(行列交换),不是反序。例如: ```python a = np.array([[1, 2], [3, 4]]) print("转置:\n", a.T) # 输出: [[1, 3], [2, 4]](行列交换) print("反序:\n", np.flip(a, axis=1)) # 输出: [[2, 1], [4, 3]](元素翻转) ``` 转置改变维度顺序,而反序保持维度不变仅翻转元素顺序[^2][^3][^5]。 - **通用函数应用**:NumPy数组支持元素级操作(如引用[4]所述),但反序操作需单独处理[^4]。 ### 总结 - **推荐方法**:对于简单反序,使用切片`array[::-1, :]`(列向)或`array[:, ::-1]`(横向);对于复杂或多维场景,使用`np.flip(array, axis)`。 - **优势**:切片速度快适合大型数组,`np.flip()`可读性好。 - 如果您有具体数组结构或性能需求,可以提供更多细节,我可以优化示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值