今天小编给大家分享一下Numpy三维数组索引与切片如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
这是一个三维数组,关于如何判断所定义的是几维数组,请观察数组的开头和结尾的中括号数目
import numpy as np #这是一个 2x2x3 的三维数组 arr =np.array( [[[0, 1 ,2] ,[3, 4, 5]] ,[[6 ,7, 8],[9,10,11]]]) print(arr)
在多维数组中,如果你忽略后续的索引参数,他打印出的结果将会降低一个维度
我将会打印它的完整数组,以便大家用以比对
将定义的三维数组降低了一个维度,成为了二维数组
#打印以下结果 arrs = arr[1,2] #index 2 is out of bounds for axis 1 with size 2 索引2超出大小为2的轴1的范围
我们可以分析一下出现这种问题的原因:
1,首先我这是索引,arr[1,2] 的含义是,取编号是1的行,编号是2的行,我们可以思考一下,三维数组降低一个维度应是二维数组,二维数组降低一个维度应是一维数组,arr[1,2]中的“1”呢,应是三维数组中的编号为“1”的行,三维数组中编号为“1”的行,应是一个二维数组,arr[1,2]中的“2”呢,应该在二维数组的基础上,就要降低一个维度,为一维数组,在下图中一维数组只有两行,编号分别为“0”和“1”哪里来的编号为“2”呢?是不是超出索引范围了。
同样对三维数组来说,我们也可以使用类似视图的操作
arr =np.array( [[[0, 1 ,2] ,[3, 4, 5]] ,[[6 ,7, 8],[9,10,11]]]) print(arr) #打印以下结果 new_long = arr[0] new_long = 22 print(arr)
我们经过将arr 三维数组中的编号为“0”的行arr[0]拿出来,赋值给了变量名new_long ,然后将new_long进行重新赋值为 “22”,new_long的值其实就是 arr[0]的值,我们将三维数组arr的打印出来,显然数组的元素值并没有发生任何变化。有的同学会问这有什么意义呢?
我们可以对数组切片做同样的操作来看看变化
import numpy as np #这是一个 2x2x3 的三维数组 arr =np.array( [[[0, 1 ,2] ,[3, 4, 5]] ,[[6 ,7, 8],[9,10,11]],[[12,13,14],[15,16,17]]]) print(arr) #打印以下结果 #我把arr三维数组中编号为“1”,和编号为“2”的数组拿了出来赋值给一个新定义的变量名new_long new_long = arr[0:2] # print(new_long) #我对new_long中的数据进行了篡改 new_long[0] = 22 # arr[0] = new_long #但是当我打印最初定义的三维数组 arr时,发现它的数据被篡改 print(arr)
你看发生了变化,我将三维数组中前两行拿了出来,是两个二维数组,然后我对第一个二维数组进行篡改当我再次打印最初定义的三维数组时发现它的数据发生了变化。最初定义的数组也被篡改了
说明了什么在numpy模块中定义的数组无论是几维,都遵循一个定义数组的切片是原数组的视图,任何对于视图的修改都会反映到原数组上。