ndnarry矩阵处理
ndarray的矩阵运算
数组是编程中的概念,矩阵、矢量是数学概念。
在计算机编程中,矩阵可以用数组形式定义,矢量可以用结构定义!
1. 矢量运算:相同大小的数组间运算应用在元素上
示例代码(1):
# 矢量与矢量运算 arr = np.array([[1, 2, 3], [4, 5, 6]]) print("元素相乘:") print(arr * arr) print("矩阵相加:") print(arr + arr)
运行结果:
元素相乘: [[ 1 4 9] [16 25 36]] 矩阵相加: [[ 2 4 6] [ 8 10 12]]
2. 矢量和标量运算:"广播" - 将标量"广播"到各个元素
示例代码(2):
# 矢量与标量运算 print(1. / arr) print(2. * arr)
运行结果:
[[ 1. 0.5 0.33333333] [ 0.25 0.2 0.16666667]] [[ 2. 4. 6.] [ 8. 10. 12.]]
ndarray的索引与切片
1. 一维数组的索引与切片
与Python的列表索引功能相似
示例代码(1):
# 一维数组
arr1 = np.arange(10)
print(arr1)
print(arr1[2:5])
运行结果:
[0 1 2 3 4 5 6 7 8 9]
[2 3 4]
2. 多维数组的索引与切片:
arr[r1:r2, c1:c2]
arr[1,1] 等价 arr[1][1]
[:] 代表某个维度的数据
示例代码(2):
# 多维数组 arr2 = np.arange(12).reshape(3,4) print(arr2) print(arr2[1]) print(arr2[0:2, 2:]) print(arr2[:, 1:3])
运行结果:
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [4 5 6 7] [[2 3] [6 7]] [[ 1 2] [ 5 6] [ 9 10]]
3. 条件索引
布尔值多维数组:arr[condition],condition也可以是多个条件组合。
注意,多个条件组合要使用 & | 连接,而不是Python的 and or。
示例代码(3):
# 条件索引 # 找出 data_arr 中 2005年后的数据 data_arr = np.random.rand(3,3) print(data_arr) year_arr = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]]) is_year_after_2005 = year_arr >= 2005 print(is_year_after_2005, is_year_after_2005.dtype) filtered_arr = data_arr[is_year_after_2005] print(filtered_arr) #filtered_arr = data_arr[year_arr >= 2005] #print(filtered_arr) # 多个条件 filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)] print(filtered_arr)
运行结果:
[[ 0.53514038 0.93893429 0.1087513 ] [ 0.32076215 0.39820313 0.89765765] [ 0.6572177 0.71284822 0.15108756]] [[False False False] [ True False True] [False False True]] bool [ 0.32076215 0.89765765 0.15108756] #[ 0.32076215 0.89765765 0.15108756] [ 0.53514038 0.1087513 0.39820313]
ndarray的维数转换
二维数组直接使用转换函数:transpose()
高维数组转换要指定维度编号参数 (0, 1, 2, …),注意参数是元组
示例代码:
arr = np.random.rand(2,3) # 2x3 数组 print(arr) print(arr.transpose()) # 转换为 3x2 数组 arr3d = np.random.rand(2,3,4) # 2x3x4 数组,2对应0,3对应1,4对应3 print(arr3d) print(arr3d.transpose((1,0,2))) # 根据维度编号,转为为 3x2x4 数组
运行结果:
# 二维数组转换 # 转换前: [[ 0.50020075 0.88897914 0.18656499] [ 0.32765696 0.94564495 0.16549632]] # 转换后: [[ 0.50020075 0.32765696] [ 0.88897914 0.94564495] [ 0.18656499 0.16549632]]
# 高维数组转换
# 转换前:
[[[ 0.91281153 0.61213743 0.16214062 0.73380458]
[ 0.45539155 0.04232412 0.82857746 0.35097793]
[ 0.70418988 0.78075814 0.70963972 0.63774692]]
[[ 0.17772347 0.64875514 0.48422954 0.86919646]
[ 0.92771033 0.51518773 0.82679073 0.18469917]
[ 0.37260457 0.49041953 0.96221477 0.16300198]]]
# 转换后:
[[[ 0.91281153 0.61213743 0.16214062 0.73380458]
[ 0.17772347 0.64875514 0.48422954 0.86919646]]
[[ 0.45539155 0.04232412 0.82857746 0.35097793]
[ 0.92771033 0.51518773 0.82679073 0.18469917]]
[[ 0.70418988 0.78075814 0.70963972 0.63774692]
[ 0.37260457 0.49041953 0.96221477 0.16300198]]]