python数据分析:numpy数组的索引与切片

时间:2022-06-24 21:26:41

数组的切片

Numpy的数组与python内置的列表这个数据结构用法有点类似。

In [1]: import numpy as np

In [2]: array=np.arange(9)

In [3]: array
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [4]: array[5:8]
Out[4]: array([5, 6, 7])

我们可以将单个标量赋值给一个切片,该值会自动传播到整个切片的选区。

In [5]: array[5:8]=12

In [6]: array
Out[6]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8])

如果想取得一块副本而不是直接在矩阵上修改,可以使用copy()的办法显式的复制一下。
在高维度数组中,之前索引位置上的元素不在是一个标量,而是一个一维数组。

In [8]: array2=np.array([[1,2,3],[4,5,6],[7,8,9]])

In [9]: array2[2]
Out[9]: array([7, 8, 9])

数组中的元素索引

切片索引
之前如何切片已经讨论过,所以切片索引方法与之前相类似

In [10]: arr=np.arange(20)

In [11]: arr[1:6]
Out[11]: array([1, 2, 3, 4, 5])

到高维数组中,切片索引则有了更多的考究。

In [14]:  arr2=np.array([[1,2,3],[2,3,4],[4,5,6]])

In [15]: arr2[:2]
Out[15]:
array([[1, 2, 3],
[2, 3, 4]]
)

切片是沿着一个轴向选取元素的,我们在高维数组中也可以一次传入多个切片,作为索引。

In [16]: arr2[:2,1:]
Out[16]:
array([[2, 3],
[3, 4]]
)

只有冒号时表示选取了整个轴。

布尔型索引

In [26]: ch=np.array(['a','a','b','c','d','g','a'])

In [27]: data=randn(7,4)

In [28]: ch=='a'
Out[28]: array([ True, True, False, False, False, False, True], dtype=bool)

In [29]: data
Out[29]:
array([[-1.02076513, 0.19244239, 0.08242597, -0.41673086],
[ 1.19849582, -0.72313653, 0.32134828, 2.49317835],
[ 0.48312431, -0.25152316, 0.61829 , -0.07175601],
[ 0.89039771, 0.60401248, 1.04225478, -0.80202465],
[-0.32040537, 0.48092997, 1.39808417, 0.65499188],
[-0.64605159, -0.53074611, 0.51109089, 0.03693914],
[-1.27989762, 0.05983575, 1.91029733, 0.44180378]]
)

In [30]: data[ch=='a']
Out[30]:
array([[-1.02076513, 0.19244239, 0.08242597, -0.41673086],
[ 1.19849582, -0.72313653, 0.32134828, 2.49317835],
[-1.27989762, 0.05983575, 1.91029733, 0.44180378]]
)

布尔型的数组可以用于数组索引,但是这个数组的长度必须和被索引的轴的长度一致,而且可以与其他的索引方式混合使用。
注意:python中的关键字and和or在布尔型数组中无效。
我们可以使用布尔型索引来对数组设置一些值,比如我需要将ch数组中不为’a’的值统统修改为’b’

In [31]: ch[ch!='a']='b'

In [32]: ch
Out[32]:
array(['a', 'a', 'b', 'b', 'b', 'b', 'a'],
dtype='<U1')