数组基本切片
数组切片与列表切片形式上相同,但有重要区别:数组切片得到的是原始数组的视图,对视图也就是切片的任何修改都会直接影响到原始数组;若要避免此情况发生,需对切片进行复制操作。
In [1]: import numpy as np
In [2]: arr=np.array([1,2,3,4,5,6,7,8,9,])
# 获取切片
In [3]: arr1=arr[5:8]
In [4]: arr1
Out[4]: array([6, 7, 8])
# 修改切片内容
In [5]: arr1[1]=99
In [6]: arr1
Out[6]: array([ 6, 99, 8])
# 原始数组被修改
In [7]: arr
Out[7]: array([ 1, 2, 3, 4, 5, 6, 99, 8, 9])
# 获取切片副本
In [8]: arr2=arr[1:4].copy()
# 修改切片副本
In [9]: arr2[:]=88
In [10]: arr2
Out[10]: array([88, 88, 88])
# 原始数组未被修改
In [11]: arr
Out[11]: array([ 1, 2, 3, 4, 5, 6, 99, 8, 9])
多维数组索引
多维数组中,索引位置的元素是索引位置的低一维度数组:
In [15]: arr3d
Out[15]:
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# 三维数组索引位置元素为二维数组
In [16]: arr3d[0]
Out[16]:
array([[1, 2, 3],
[4, 5, 6]])
# 二维数组arr3d[0]的索引位置元素为一维数组
In [18]: arr3d[0][1]
Out[18]: array([4, 5, 6])
# 以上写法等价于
In [19]: arr3d[0,1]
Out[19]: array([4, 5, 6])
# 注意所得到的所有数组都是原数组的视图,修改后会影响到原数组
In [20]: arr3d[0,1]=99
In [21]: arr3d
Out[21]:
array([[[ 1, 2, 3],
[99, 99, 99]],
[[ 7, 8, 9],
[10, 11, 12]]])
多维数组切片
关于轴的概念:N维数组[0轴,1轴,2轴…]
0轴代表数组里的下一维度的所有数组,如三维数组的0轴代表里面的所有二维数组,若在0轴进行切片,则根据索引位置得到符合切片条件的二维数组组成的三维数组
In [22]: arr3d=np.random.randn(3,3,3)
In [23]: arr3d
Out[23]:
array([[[ 1.02094993, -0.25748933, 0.49529658],
[-0.73540525, 0.03011562, -0.11699791],
[-0.66396291, 0.47977574, -0.86229023]],
[[-0.39319381, 0.84935699, -1.72054416],
[-0.36710115, 0.54590238, 0.12768586],
[ 0.006033 , 1.26805717, -0.85041817]],
[[ 2.23066809, -0.03880021, 0.62391508],
[-0.51181805, 0.55001299, -0.52990981],
[ 0.50243183, -1.29463259, 0.2809969 ]]])
# 在0轴选取索引为1的数组,得到一个二维数组
In [24]: arr3d[1]
Out[24]:
array([[-0.39319381, 0.84935699, -1.72054416],
[-0.36710115, 0.54590238, 0.12768586],
[ 0.006033 , 1.26805717, -0.85041817]])
# 选取整个0轴所有数组,得到一个与原数组相同的三维数组
In [25]: