Numpy数组的转置和轴交换的实现
作者:算力鬼才信
NumPy 数组在进行转置时不会实际移动内存中的任何数据 位置只是改变对原始矩阵的索引方式 ,比如我原来是行索引现在变为列索引了
转置是一种视图并不是对原数组的复制数组转置拥有transpose方法,也有特殊的T属性
对于numpy数组的转置仅限于一维和二维数组,使用的是 numpy中的T 属性
创建一个0-15的一维数组,并且对它进行了数组重组,变为 2 x 2 x 4的三维数组,并对它进行转置
import numpy as np #创建一个三维数组,这个三维数组的形状是 2 x 2 x 4 ,三维数组包括两个二维数组,二维数组中包含两个一维数组,一维数组的数组维度长度是 4 arr = np.arange(16) arr2 = arr.reshape(4,-1) arr3 = arr.T 0
我们通过数组的迭代来检查numpy数组的转置是否对原数组位置做了改变,这里我们要引用numpy.nditer() 方法
对原数组进行迭代:
arr = np.arange(16) arr2 = arr.reshape(4,-1) for x in np.nditer(arr2): # 需要注意的是for循环的末尾一定要加上 冒号(:) print(x,end=" ")
我们对通过 arr2的转置数组arr3做迭代
arr = np.arange(16) arr2 = arr.reshape(4,-1) arr3 = arr2.T for xx in np.nditer(arr3): print(xx,end=" ")
可以发现他们的打印结果未发生任何变化,所以可以证实,数组转置并不是改变了原数组的元素位置,只是改变了它的索引方式。
其实我可以告诉你,一个最终结果,原数组和对原数组的转置在内存中是共享数据的,,类似于家里的小狗叫做旺旺 和小黄,其实指的是是一个东西
在这里需要注意的是,在数组转置下对数组作修改一定会影响到原数组
例如:
arr = np.arange(10).reshape(2,5) arr2 = arr.T #为了方便理解我上述说的意思,我引用下面的实例 #对arr2中的某一数组作以修改 print(arr) # 原数组 arr2[2][1] = 200 #在原数组转置后,对其中 某一个元素做修改 print(arr2) # 打印对原数组转之后的数组 print(arr) #打印原数组
发现了什么我们最初定义的数组被篡改了,不知道大家对数组的转置和原数组公用一个内存位置的概念的理解是否变得容易
array.transpose() 轴交换
虽然,transpose方法可以实现转置,但是它的真正用途是轴交换,我前面提到.T 方法只适合用于一二数组,三维,四维就要用到transpose()方法。
transpose() 方法中的参数和数组的维度有关,拿三位数组来说共需要三个参数分别是,
transpose(x,y,z)其中的参数分别对应0,1,2,只需要变换轴对应数字参数的顺序就可以将数组进行轴的变换。
原数组对应的参数顺序是,transpose(0,1,2)
import numpy as np arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(arr) arr2 = arr.transpose((0,2,1)) #我在这里改变了列和纵深的顺序 print(arr2)
经过轴交换后arr数组打印结果
这一块比较难于理解,我也是看了好久现在也是马马虎虎,我可以告诉大家一个比较笨的方法
请记住,(x,y,z)或者(0,1,2)分别代表行轴,列轴,纵深轴,transpose 方法是对它们的轴进行了交换。
到此这篇关于Numpy数组的转置和轴交换的实现的文章就介绍到这了,更多相关Numpy数组转置和轴交换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!