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)