python中的多维数组操作
开始之前
这不是一个讲解或者记录python语法操作的文章,这是一个从python切片操作引入多维困惑的记录,一切都始于python的切片,这个语法有点意思,比如有一个数组[1,2,3,4,5,6,7],我们想要得到index=2到index=5元素的新数组,可以使用 如下语法(这里说明一下:用index=n 是为了避免语义歧义,以为程序的index都是从0开始的)
import numpy as py
arr = np.array([1,2,3,4,5,6,7])
newarr = arr[2:6]
print(newarr)
# 输出结果是
# [3 4 5 6]
以上是一个一维数组,特别好理解,如果要获取所有元素,可以使用[:],代码如下
arr = np.array([1,2,3,4,5,6,7])
newarr = arr[:]
print(newarr)
# 输出结果是
# [1 2 3 4 5 6 7]
二维数组
按照上面的管理,那么二维数组的操作开始有意思起来,因为切片可以对第一维度操作,也可以对第二维度操作,便于我们理解,我可以把它说成是一个表格,也就是行列的形式,那么我们声明一个二维数组,并且对行操作,列操作分别作出测试,代码如下
# 创建一个3行4列的二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)
# 输出内容也是标准的行列形式,特别容易理解
# 输出结果
#[[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
# 对行切片
# 取index=0 到 index = 1的行内所有列数据
arrRow = arr[0:2,:]
print(arrRow)
# 输出结果
# [[1 2 3 4]
# [5 6 7 8]]
# 对列切片
# 取所有行的index = 0列到 index= 1的列
arrCol = arr[:,0:2]
print(arrCol)
# 输出结果
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
# 取所有行的index = 1的列
arrCol1 = arr[:,0:1]
print(arrCol1)
# 输出结果,还是一个二维数组
# [[1]
# [5]
# [9]]
重点来了 降维操作
按照上面的操作,可以进行各种形式的行列(一维二维)切片操作,但是无论怎么操作得到的都是一个二维数组,这对计算都是不特别的友好,那么就有一种降维操作方式,代码如下:
# 降维操作,还是取所有行的index = 1的列
arrCol2 = arr[:,1]
print(arrCol2)
# 输出结果
# [ 2 6 10]
# 降维操作,取index=1的所有行数据
arrRow1 = arr[1,:]
print(arrRow1)
# 输出结果
# [5 6 7 8]
上面的操作无论是行降维还是列降维,都将二维数组降维成了一维数组,这让我想起来三体小说里面的降维展开和高纬度压缩攻击,所以我们接下来看看三维的操作吧。
三维数组
三维,先说说三维,比较好理解,在数学中就是 x,y,z三轴坐标系,现实生活中任何物体都可以通过三维定位法找到这里,比如维度多少,经度多少 高度多少的一个位置,这里好像也还比较容易理解,下面看看代码吧
#创建一个三位数组,这次我们来点简单的方法
vector = np.arange(48).reshape(4,4,3)
print(vector)
# 输出结果,一个4x4的表格,每一个表格内的元素有3个,结果如下
# [[[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
# [[12 13 14]
# [15 16 17]
# [18 19 20]
# [21 22 23]]
# [[24 25 26]
# [27 28 29]
# [30 31 32]
# [33 34 35]]
# [[36 37 38]
# [39 40 41]
# [42 43 44]
# [45 46 47]]]
# 方法2 暂时不用
# vector1 = np.random.randint(1,5,(4,4,3))
# print(vector1)
看完三维的输出,我们可以理解成三维就是在每一个二维空间内的元素是一个一维数组。
关于三维切片
三维的切片操作和二维没有什么区别,无非就是操作的时候多了一个维度,下面我以一个简单的粒子说明一下:
# 三维切片 将所有的行、列中index = 1 的数字变成 0
vector[:,:,1] = 0
print(vector)
# 输出结果
# [[[ 0 0 2]
# [ 3 0 5]
# [ 6 0 8]
# [ 9 0 11]]
# [[12 0 14]
# [15 0 17]
# [18 0 20]
# [21 0 23]]
# [[24 0 26]
# [27 0 29]
# [30 0 32]
# [33 0 35]]
# [[36 0 38]
# [39 0 41]
# [42 0 44]
# [45 0 47]]]
# 降维操作 将所有的行、列中index = 1 的数字取出来
# 输出的结果应该是一个4x4的二维数组,将第三维度降级
vector_all_all_1 = vector[:,:,1]
print(vector_all_all_1)
# 输出结果
# [[0 0 0 0]
# [0 0 0 0]
# [0 0 0 0]
# [0 0 0 0]]
四维操作
四维,这里不是人们常说的x,y,z加上时间的说法,我并不认为这是四维,如果说时间归纳到空间维度,这是不合理的,你可以看看我刚刚说的这句话:“时间归纳到空间维度”,也就是说时间和空间可以理解是平衡的两个东西。那么,空间四维应该怎么理解呢,不如我们先从程序考虑一下。
从程序中,我们知道了一维是一行数据,二维是一个表格数据,三维是一个表格内的每一个元素是一个一维数据,那么四维呢?我们这里先留个疑问。
在数学计算中,二维计算是简单的,清晰的,所有很多时候,甚至大部分时候我们都需要将高纬度的数据降维后进行计算,如果你看到这里了,并且你知道一些关于三维的计算公式,希望能分享出来。
在三维中,透视计算,交叉计算,包括距离计算其实都是降维成几个二维计算后再组合成三维的结果。(不知道对不对,而且跑题了)
我们想一下上面的问题吧,四维是应该在三维的基础上,每一个元素内是一个一维数组,还是在三维的基础上,每个元素是一个二维数组呢,按照幼儿园的法则,4=3+1,所以是每一个三维元素是一个一维数组。
通过代码展示如下:
# 四维操作
mat = np.arange(192).reshape(4,4,3,4)
print(mat)
# 输出结果
# [[[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# [[ 12 13 14 15]
# [ 16 17 18 19]
# [ 20 21 22 23]]
# [[ 24 25 26 27]
# [ 28 29 30 31]
# [ 32 33 34 35]]
# [[ 36 37 38 39]
# [ 40 41 42 43]
# [ 44 45 46 47]]]
# [[[ 48 49 50 51]
# [ 52 53 54 55]
# [ 56 57 58 59]]
# [[ 60 61 62 63]
# [ 64 65 66 67]
# [ 68 69 70 71]]
# [[ 72 73 74 75]
# [ 76 77 78 79]
# [ 80 81 82 83]]
# [[ 84 85 86 87]
# [ 88 89 90 91]
# [ 92 93 94 95]]]
# [[[ 96 97 98 99]
# [100 101 102 103]
# [104 105 106 107]]
# [[108 109 110 111]
# [112 113 114 115]
# [116 117 118 119]]
# [[120 121 122 123]
# [124 125 126 127]
# [128 129 130 131]]
# [[132 133 134 135]
# [136 137 138 139]
# [140 141 142 143]]]
# [[[144 145 146 147]
# [148 149 150 151]
# [152 153 154 155]]
# [[156 157 158 159]
# [160 161 162 163]
# [164 165 166 167]]
# [[168 169 170 171]
# [172 173 174 175]
# [176 177 178 179]]
# [[180 181 182 183]
# [184 185 186 187]
# [188 189 190 191]]]]
五维数组
直接上代码吧,先看看代码再想想,这是怎么回事
# 五维操作
mat = np.arange(384).reshape(4,4,3,4,2)
print(mat)
# 输出结果,自己运行吧
# [[[[[ 0 1]
# [ 2 3]
# [ 4 5]
# [ 6 7]]
# [[ 8 9]
# [ 10 11]
# [ 12 13]
# [ 14 15]]
# [[ 16 17]
# [ 18 19]
# [ 20 21]
# [ 22 23]]]
# [[[ 24 25]
# [ 26 27]
# [ 28 29]
# [ 30 31]]
# [[ 32 33]
# [ 34 35]
# [ 36 37]
# [ 38 39]]
# [[ 40 41]
# [ 42 43]
# [ 44 45]
# [ 46 47]]]
# [[[ 48 49]
# [ 50 51]
# [ 52 53]
# [ 54 55]]
# [[ 56 57]
# [ 58 59]
# [ 60 61]
# [ 62 63]]
# [[ 64 65]
# [ 66 67]
# [ 68 69]
# [ 70 71]]]
# [[[ 72 73]
# [ 74 75]
# [ 76 77]
# [ 78 79]]
# [[ 80 81]
# [ 82 83]
# [ 84 85]
# [ 86 87]]
# [[ 88 89]
# [ 90 91]
# [ 92 93]
# [ 94 95]]]]
# [[[[ 96 97]
# [ 98 99]
# [100 101]
# [102 103]]
# [[104 105]
# [106 107]
# [108 109]
# [110 111]]
# [[112 113]
# [114 115]
# [116 117]
# [118 119]]]
# [[[120 121]
# [122 123]
# [124 125]
# [126 127]]
# [[128 129]
# [130 131]
# [132 133]
# [134 135]]
# [[136 137]
# [138 139]
# [140 141]
# [142 143]]]
# [[[144 145]
# [146 147]
# [148 149]
# [150 151]]
# [[152 153]
# [154 155]
# [156 157]
# [158 159]]
# [[160 161]
# [162 163]
# [164 165]
# [166 167]]]
# [[[168 169]
# [170 171]
# [172 173]
# [174 175]]
# [[176 177]
# [178 179]
# [180 181]
# [182 183]]
# [[184 185]
# [186 187]
# [188 189]
# [190 191]]]]
# [[[[192 193]
# [194 195]
# [196 197]
# [198 199]]
# [[200 201]
# [202 203]
# [204 205]
# [206 207]]
# [[208 209]
# [210 211]
# [212 213]
# [214 215]]]
# [[[216 217]
# [218 219]
# [220 221]
# [222 223]]
# [[224 225]
# [226 227]
# [228 229]
# [230 231]]
# [[232 233]
# [234 235]
# [236 237]
# [238 239]]]
# [[[240 241]
# [242 243]
# [244 245]
# [246 247]]
# [[248 249]
# [250 251]
# [252 253]
# [254 255]]
# [[256 257]
# [258 259]
# [260 261]
# [262 263]]]
# [[[264 265]
# [266 267]
# [268 269]
# [270 271]]
# [[272 273]
# [274 275]
# [276 277]
# [278 279]]
# [[280 281]
# [282 283]
# [284 285]
# [286 287]]]]
# [[[[288 289]
# [290 291]
# [292 293]
# [294 295]]
# [[296 297]
# [298 299]
# [300 301]
# [302 303]]
# [[304 305]
# [306 307]
# [308 309]
# [310 311]]]
# [[[312 313]
# [314 315]
# [316 317]
# [318 319]]
# [[320 321]
# [322 323]
# [324 325]
# [326 327]]
# [[328 329]
# [330 331]
# [332 333]
# [334 335]]]
# [[[336 337]
# [338 339]
# [340 341]
# [342 343]]
# [[344 345]
# [346 347]
# [348 349]
# [350 351]]
# [[352 353]
# [354 355]
# [356 357]
# [358 359]]]
# [[[360 361]
# [362 363]
# [364 365]
# [366 367]]
# [[368 369]
# [370 371]
# [372 373]
# [374 375]]
# [[376 377]
# [378 379]
# [380 381]
# [382 383]]]]]
因为三维数组是我能够理解的极限,大脑的想象空间根本不够想象五维,所以我不得不把这个数组拆一拆,这个数组是一个三维数组和一个二维数组组成的,三维数组是 4 * 4 * 3的数组,二维数组是4 * 2的二维数组。每一个三维数组的元素是一个二维数组。
多维数组的压缩以展开可以遮天蔽日
以此类推,我们得到了六维数组,是每一个三维数组的元素是一个三维数组,这又让我想起了我们的现实世界,当我们使用精度,维度,高度的时候能够定位到一个位置,可是如果我们将这个位置无限微观的观察下去,内部又是通过三维定位的世界。
那我们生活的这个三维世界,会不会是更高层维度中的微观世界呢?
原来三体中说的维度压缩与扩展不是数量级的是这个意思,为什么一个十维世界的东西压缩有在三维世界展开可以遮蔽整个宇宙,实现整个宇宙闪烁貌似在python的数组操作中找到了答案。