1、numpy中的数组
(1)数组维数
import numpy as np
arr1d = np.arange(24).reshape(24)
print('一维数组:', arr1d)
arr2d = np.arange(24).reshape((4, 6))
print('二维数组:\n', arr2d)
arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
输出结果:
一维数组: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
二维数组:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
三维数组:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
Process finished with exit code 0
arrange()方法产生整数0~23,并重新按指定维数分配。
(2)数组元素索引
一维数组arr1d可以通过下标i(0 =< i <= len(arr1d)-1)来索引,例如arr1d[6]=6,也就是说一个下标i对象数组中的一个元素,反之亦然。
二维数组arr2d可以通过两个下标i(0 =< i <= 数组行数-1)和j(0 =< j <= 数组列数-1)来索引,例如arrd2d[2][5]=17,也就是说一对下标(i,j)对应数组中的一个元素。
三维数组arr3d可以通过三个下标i(0 =< i <= reshape方法中第一个参数-1)、j(0 =< j <= 数组行数-1)和k(0 =< k <= 数组列数-1)来索引,例如arrd3d[0][1][2]=6,也就是说下标(i,j,k)对应数组一个元素。
类似地,n维数组arrdnd可以通过下标(m1,m2,m3,...,mn)来索引。
我们知道,对于二维平面中的一个点(x,y),x称为该点的横坐标或x-轴坐标,y称为该店的纵坐标或y-轴坐标,类似的,我们可以将下标(m1,m2,m3,...,mn)看成一个n维空间中的点,在这个空间中也有坐标轴,因为有n个坐标轴,用单个字母无法命名,所以我们给每个坐标轴编一个号,分别称为0-轴,1-轴,2-轴,……,n-轴。
2、numpy的.T转置
import numpy as np
arr2d = np.arange(24).reshape((4, 6))
print('二维数组:\n', arr2d)
print('二维数组转置后:\n',arr2d.T)
arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
print('三维数组转转置后:\n',arr3d.T)
输出结果:
二维数组:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
二维数组转置后:
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
三维数组:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
三维数组转转置后:
[[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
Process finished with exit code 0
.T对二维数组操作比较容易,只是行列转换,三维看起来有些难度,更不要说n维数组了,那么.T究竟做了什么了,其实只是将数组下标反序,例如n维数组arrdnd的下标(m1,m2,m3,...,mn)对应的元素,经过.T转置后,在(mn,...,m2,m1)的位置上,例如:
arrnd=np.arange(120).reshape(1,2,3,4,5)
arrndT=arrnd.T
print('arrnd[0][1][2][3][4]=', arrnd[0][1][2][3][4])
print('arrndT[4][3][2][1][0]=', arrndT[4][3][2][1][0])
输出结果:
arrnd[0][1][2][3][4]= 119
arrndT[4][3][2][1][0]= 119
示例中定义了一个5维数组。
3、 numpy的transpose
首先我们来看一个三维数组的例子:
import numpy as np
arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
arr3dT=arr3d.transpose(1, 0, 2)
print('三维数组转转置后:\n', arr3dT)
输出结果:
三维数组:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
三维数组转转置后:
[[[ 0 1 2 3]
[12 13 14 15]]
[[ 4 5 6 7]
[16 17 18 19]]
[[ 8 9 10 11]
[20 21 22 23]]]
Process finished with exit code 0
transpose究竟做了什么?首先对三维数组的维数(2,3,4)依次编号0,1,2,称之为0-轴,1-轴,2-轴。transpose(1,0,2)表示对换了1-轴和0-轴(本来应该是0,1,2)的位置,2-轴没变。也就是说tranpose会将下标(i,j,k)对应的元素变换到下标(j,i,k)上。例如三维数组元素11的原来下标位置是(0,2,3),通过transpose应该变换到(2,0,3)的位置上,变化后的数组(2,0,3)的位置上确实是11。
3、numpy的swapaxes
swapaxes顾名思义是交换轴的意思。我们看个例子:
import numpy as np
arr3d = np.arange(24).reshape(2, 3, 4)
print('三维数组:\n', arr3d)
arr3dT=arr3d.swapaxes(2, 1)
print('三维数组转转置后:\n', arr3dT)
输出结果:
三维数组:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
三维数组转转置后:
[[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[[12 16 20]
[13 17 21]
[14 18 22]
[15 19 23]]]
Process finished with exit code 0
swapaxes(p,q)(p和q是轴的编号)表示对换p和q轴,案例中表示对换1-轴和2-轴。