numpy的切片和索引

ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作 一样。ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop 及 step 参数进行,从 原数组中切割出一个新数组。

一维数组切片和索引的使用

import numpy as np
x = np.arange(10)
y = x[2:7:2]
z = x[2:]
print(y)
print(z)

运行结果如下:

[2 4 6]
[2 3 4 5 6 7 8 9]

根据索引直接获取

import numpy as np
x = np.arange(1,13)
a = x.reshape(4,3)
print("数组元素")
print(a)
print("获取第二行")
print(a[1])
print("获取第三行第二列")
print(a[2][1])

运行结果如下:

数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
获取第二行
[4 5 6]
获取第三行第二列
8

二维数组切片的使用

import numpy as np
x = np.arange(1,13)
a = x.reshape(4,3)
print("数组元素")
print(a)
# 使用索引获取
print("所有行的第二列")
print(a[:,1])
print("奇数行的第一列")
print(a[::2,0])

运行结果如下:

数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
所有行的第二列
[ 2  5  8 11]
奇数行的第一列
[1 7]

使用坐标获取数组[x,y]

import numpy as np
x = np.arange(1,13)
a = x.reshape(4,3)
print("数组元素")
print(a)
# 使用索引获取
print('获取第三行第二列')
print(a[2,1])
print('同时获取第三行第二列,第四行第一列')
print(np.array((a[2,1],a[3,0])))
print(a[(2,3),(1,0)]) #2,1 3,0

运行结果如下:

数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
获取第三行第二列
8
同时获取第三行第二列,第四行第一列
[ 8 10]
[ 8 10]

索引为负数来获取

import numpy as np
x = np.arange(1,13)
a = x.reshape(4,3)
print("数组元素")
print(a)
print("获取最后一行")
print(a[-1])
print("行进行倒序")
print(a[::-1])
print("行列都倒序")
print(a[::-1,::-1])

运行结果如下:

数组元素
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
获取最后一行
[10 11 12]
行进行倒序
[[10 11 12]
 [ 7  8  9]
 [ 4  5  6]
 [ 1  2  3]]
行列都倒序
[[12 11 10]
 [ 9  8  7]
 [ 6  5  4]
 [ 3  2  1]]

切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a[...,1]) # 第2列元素
print(a[1,...]) # 第2行元素
print(a[...,1:]) # 第2列及剩下的所有元素

运行结果如下:

[2 4 5]
[3 4 5]
[[2 3]
 [4 5]
 [5 6]]

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

import numpy as np
 
a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])

运行结果为:

[2  4  6]

实例获取了 4X3 数组中的四个角的元素

import numpy as np
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
print('
')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print  ('这个数组的四个角元素是:')
print (y)

运行结果如下:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]

布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

import numpy as np  
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:')
print (x)
print ('
')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x >  5])

输出结果为:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

大于 5 的元素是:
[ 6  7  8  9 10 11]

下面再举个例子

import numpy as np
# 布尔型索引及切片

ar = np.arange(12).reshape(3,4)
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(ar)
print(i)
print(j)
print(ar[i,:])  # 在第一维度做判断,只保留True,这里第一维度就是行,ar[i,:] = ar[i](简单书写格式)
print(ar[:,j])  # 在第二维度做判断,这里如果ar[:,i]会有警告,因为i是3个元素,而ar在列上有4个
# 布尔型索引:以布尔型的矩阵去做筛选

m = ar > 5
print(m)  # 这里m是一个判断矩阵
print(ar[m])  # 用m判断矩阵去筛选ar数组中>5的元素 → 重点

运行结果如下:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[ True False  True]
[ True  True False False]
[[ 0  1  2  3]
 [ 8  9 10 11]]
[[0 1]
 [4 5]
 [8 9]]
[[False False False False]
 [False False  True  True]
 [ True  True  True  True]]
[ 6  7  8  9 10 11]

~(取补运算符)来过滤 NaN。

import numpy as np 
 
a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print (a[~np.isnan(a)])

输出结果为:

[ 1.   2.   3.   4.   5.]

改变数组的维度
处理数组的一项重要工作就是改变数组的维度,包含提高数组的维度和降低数组的维 度,还包括数组的转置。Numpy 提供的大量 API 可以很轻松地完成这些数组的操作。例如, 通过 reshape 方法可以将一维数组变成二维、三维或者多维数组。通过 ravel 方法或 flatten 方法可以将多维数组变成一维数组。改变数组的维度还可以直接设置 Numpy 数组的 shape 属性(元组类型),通过 resize 方法也可以改变数组的维度。

import numpy as np
# 创建一维数组
a = np.arange(24)
print(a)
print("数组a的维度: ",a.shape)
print('-'*30)
# 使用reshape将一维数组变成三维数组
b = a.reshape(2,3,4)
print(b)
print("数组b的维度:",b.shape)
print("-"*30)
# 将a变成二维数组
c = a.reshape(3,8)
print(c)
print("数组c的维度:",c.shape)
print("-"*30)
#将 a 变成二维数组
c=a.reshape(3,8)
print(c)
print('数组 c 的维度:',c.shape)
print('-'*30)
# 使用reval函数将三维的b变成一维数组
a1=b.ravel()
print(a1)
print('-'*30)
#使用 flatten 函数将二维的 c 变成一维的数组
a2=c.flatten()
print(a2)
print('-'*30)
别废话,拿你代码给我看。
原文地址:https://www.cnblogs.com/lvxueyang/p/13707512.html