数组的基本操作
数组生成后我们需要对数组进行一系列的操作,比如查看数组的特征,读取数组中某一个元素的值,数组切片、重组以及合并和拆分等,本Note总结这部分内容。
读取数组的特征(attribute)
数组的特征包含维度,每一维的元素个数,总的元素个数,数据类型,元素及数组占用的数据空间大小等。
import numpy as np
# 生成一个均值为0,方差为1的正态分布随机数组成的3*4*5数组
x1 = np.random.normal(0,1,size=(3,4,5))
# 获取数组的维度,结果输出 3
print("x1 dimention: ", x1.ndim)
# x1 dimention: 3
# 获取数组每一维度的元素个数,结果输出(3,4,5)
print("x1 shape: ", x1.shape)
# x1 shape: (3, 4, 5)
# 获取数组总的元素个数,结果输出 60
print("x1 size: ", x1.size)
# x1 size: 60
# 获取数组的数据类型,结果输出 float64
print("x1 data type: ", x1.dtype)
# x1 data type: float64
# 获取数组单个元素占用的数据空间大小(单位bytes),结果输出 8 bytes
print("x1 item size: ", x1.itemsize)
# x1 item size: 8
# 获取数组总占用数据空间大小,结果输出 480 bytes
print("x1 total size: ", x1.nbytes)
# x1 total size: 480
数组索引(indexing)- 读取/修改单个元素
NumPy的数组索引和Python List的索引类似,从0索引开始。以下以读取元素为例
# 生成一个含10个元素的一维随机数组
x2 = np.random.random(10)
# array([0.91457994, 0.06262808, 0.36183464, 0.17594106, 0.33792884, 0.33788772, 0.91892014, 0.81608134, 0.08148799, 0.9756082 ])
# 提取第5个元素,两种方法
x2[4] # 0.33792883685065367
x2[-6] # 0.33792883685065367
# 生成一个含10个元素的二维随机数组
x3 = np.random.random(size=(2,5))
# array([[0.09044767, 0.58838914, 0.68890439, 0.18176692, 0.22996167],
# [0.59272893, 0.11073436, 0.99616773, 0.99205917, 0.81407968]])
# 提取第一维第4个元素
x3[0,3] # x3[0,-2], x3[-2,3], x3[-2,-2] 也可以提取同一元素
# 0.181766923314293
数组切片(Slicing)
NumPy数组切片也和Python List切片操作一致,x[start:stop:step]表示提取从索引start开始到索引stop截止步长为step的所有元素组成新的数组。
# 生成一个从0到9总共10个元素的一维数组
x4 = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 提取前5个元素
x4[:5]
# array([0, 1, 2, 3, 4])
# 提取后5个元素
x4[5:]
# array([5, 6, 7, 8, 9])
# 提取从索引3到索引6的元素
x4[3:6]
# array([3, 4, 5])
# 从数组第一个元素开始隔一个元素取一个(步长为2)
x4[::2]
# array([0, 2, 4, 6, 8])
# 从数组第二个元素开始各一个元素取一个
x4[1::2]
# array([1, 3, 5, 7, 9])
多维数组的切片操作与一维数组一致,只需要对每一个维度按照一维数组切片操作即可。
数组重组(reshaping)
比如将一个1x10的数组改成一个2x5的数组从而实现数组的重组。需要注意的是重组前后的数组大小是一样的。
# 生成一个从0到9总共10个元素的一维数组
x5 = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 重组成2x5的二维数组
x5.reshape(2,5)
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
数组合并(Concatenation)
当合并的数组具有相同的维度时,可以使用concatenate(),可以同时合并2个或2个以上数组。
# 生成两个一维数组
x6 = np.arange(1,4) # array([1, 2, 3])
x7 = np.arange(4,7) # array([4, 5, 6])
# 合并这两个数组
np.concatenate((x6,x7)) # array([1, 2, 3, 4, 5, 6])
# 生成一个二维数组
x8 = np.array([[1,2,3],[4,5,6]])
# array([[1, 2, 3],
# [4, 5, 6]])
# 合并二维数组 (默认以第一个axis为标准合并)
np.concatenate((x8, x8))
# array([[1, 2, 3],
# [4, 5, 6],
# [1, 2, 3],
# [4, 5, 6]])
# 以第二个axis为标准合并二维数组
np.concatenate((x8, x8), axis=1)
# array([[1, 2, 3, 1, 2, 3],
# [4, 5, 6, 4, 5, 6]])
不同维度的数组合并时,可以使用vstack()或者hstack(),一个是垂直合并,一个是水平合并。
# 生成一个二维数组
x9 = np.array([[1,2,3],[4,5,6]])
# array([[1, 2, 3],
# [4, 5, 6]])
# 生成一个一维数组
x10 = np.array([9,9,9]) # array([9, 9, 9])
# 垂直合并这两个数组
np.vstack((x9,x10))
# array([[1, 2, 3],
# [4, 5, 6],
# [9, 9, 9]])
# 生成一个二维数组
x11 = np.array([[9],[9]])
# array([[9],
# [9]])
# 水平合并X9和X11两个数组
np.hstack((x9,x11))
# array([[1, 2, 3, 9],
# [4, 5, 6, 9]])