Python NumPy的使用
Posted ʚVVcatɞ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python NumPy的使用相关的知识,希望对你有一定的参考价值。
NumPy
学习目标:
NumPy的使用
环境:
- Anaconda 2.0.4
- Python 3.7.10
- numpy 1.20.2
NumPy安装:
pip install numPy
Python 引入 numpy 库
import numpy as np
学习内容:
Numpy 数组操作
- 1、 数组的拼接
- 2、 数组的分割
- 3、 数组的行列交换
NumPy 统计函数
- 1、求和
- 2、均值
- 3、中值
- 4、最大值
- 5、最小值
- 6、极值
- 7、标准差
使用步骤
Numpy 数组操作
1、 数组的拼接
函数 | 描述 |
---|---|
hstack | 水平堆叠序列中的数组(列方向) |
vstack | 竖直堆叠序列中的数组(行方向) |
代码如下(示例):
import numpy as np
t1 = np.arange(12).reshape((2, 6)) # 创建一个 2行6列的数组
print(t1)
t2 = np.arange(12, 24).reshape((2, 6))
print(t2)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[[12 13 14 15 16 17]
[18 19 20 21 22 23]]
t3 = np.vstack((t1, t2)) # 竖直拼接
print(t3)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
t4 = np.hstack((t1, t2)) # 水平拼接
print(t4)
[[ 0 1 2 3 4 5 12 13 14 15 16 17]
[ 6 7 8 9 10 11 18 19 20 21 22 23]]
2、 数组的分割
函数 | 描述 |
---|---|
split | 将一个数组分割为多个子数组 |
hsplit | 将一个数组水平分割为多个子数组(按列) |
vsplit | 将一个数组垂直分割为多个子数组(按行) |
numpy.split(ary, indices_or_sections, axis)
- axis:设置沿着哪个方向进行切分,默认为 0,横向切分,即水平方向。为 1 时,纵向切分,即竖直方向。
代码如下(示例):
import numpy as np
t1 = np.arange(12).reshape((2, 6))
t2 = np.arange(12, 24).reshape((2, 6))
t3 = np.vstack((t1, t2)) # 将上面2个数组进行竖直拼接
print(t3)
t4 = np.hstack((t1, t2)) # 将t1 t2两个数组进行水平拼接
print(t4)
print(np.split(t3, 2, axis=0)) # 使用np.split()函数将上面的数组进行横向分割
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
print(np.split(t3, 2, axis=1)) # 使用np.split()函数将上面的数组进行纵向分割
[array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]]),
array([[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17],
[21, 22, 23]])]
注:axis 为 0 时在水平方向分割,axis 为 1 时在垂直方向分割。
print(np.hsplit(t4, 2)) # 用 np.hsplit()函数水平分割分割成2个数组
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
print(np.vsplit(t3, 2)) # 用 np.vsplit()函数 垂直分隔成2个数组
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])]
print(np.vsplit(t3, 4)) # 用 np.vsplit()函数 垂直分隔成4个数组
[array([[0, 1, 2, 3, 4, 5]]),
array([[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17]]),
array([[18, 19, 20, 21, 22, 23]])]
3、 数组的行列交换
代码如下(示例):
t = np.arange(12, 24).reshape(3, 4)
print(t)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
print("-------------行交换-------------")
t[[1, 2], :] = t[[2, 1], :] # 行交换 第2行与第三行进行交换
print(t)
[[ 0 1 2 3]
[ 8 9 10 11]
[ 4 5 6 7]]
print("-------------列交换-------------")
t = np.arange(0, 12).reshape(3, 4)
t[:, [0, 2]] = t[:, [2, 0]] # 列交换 第1列与第3列进行交换,每次交换都会改变原数组
print(t)
[[ 2 1 0 3]
[ 6 5 4 7]
[10 9 8 11]]
NumPy 统计函数
函数 | 描述 |
---|---|
sum | 求和 |
mean | 返回数组中元素的算术平均值 |
np.median | 中值 |
max | 最大值 |
min | 最小值 |
ptp | 极值 |
std | 标准差 |
注:标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定。
1、 求和
代码如下(示例):
t1 = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, np.nan, 15], [16, 17, 18, 19, 20]])
t2 = np.arange(12).reshape((4, 3)) # 创建 4行 3列的数组
print(t1)
print(t2)
[[ 0. 2. 3. 4. 5.]
[ 0. 7. 8. 9. 10.]
[ 0. 12. 13. nan 15.]
[ 0. 17. 18. 19. 20.]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
print(np.sum(t2)) # 计算t2数组所有的和
66
print(np.sum(t2, axis=0)) # 计算t2数组每一行相加的结果
[18 22 26]
print(np.sum(t2, axis=1)) # 计算t2数组每一列相加的结果
[ 3 12 21 30]
print(np.sum(t1, axis=0)) # 计算t1数组每一行相加的结果
[ 0. 38. 42. nan 50.]
print(np.sum(t1, axis=1)) # 计算t1数组每一列相加的结果
[14. 34. nan 74.]
注意:nan和任何值计算都为nan
2、 求和函数
# numpy中常用统计函数
t2 = np.arange(12).reshape((4, 3))
print(t2.sum(axis=0)) # 求和
[18 22 26]
3、 均值函数
print(t2.mean(axis=0)) # 均值
[4.5 5.5 6.5]
4、 中值函数
print(np.median(t2)) # 中值
print(np.median(t2, axis=0)) # 中值
5.5
[4.5 5.5 6.5]
5、 最大值与最小值函数
print(t2.max(axis=0)) # 最大值
print(t2.min(axis=0)) # 最小值
[ 9 10 11]
[0 1 2]
6、 极值函数
print(np.ptp(t2)) # 极值, 即最大值和最小值之差
print(np.ptp(t2, axis=0))
11
[9 9 9]
7、 标准差函数
print(t2.std(axis=0)) # 标准差
[3.35410197 3.35410197 3.35410197]
小结
对数组中的 nan 填充均值
# coding=utf-8
import numpy as np
# 为每一列的nan填充均值
def fill_column_ndarray(t1):
for i in range(t1.shape[1]): # 遍历每一列
temp_col = t1[:, i] # 当前的一列
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0: # 不为0,说明当前这一列中有nan
temp_not_nan_col = temp_col[temp_col == temp_col] # 当前一列不为nan的array
# 选中当前为nan的位置,把值赋给为不为nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t1
# 为每一行的nan填充均值
def fill_row_ndarray(t2):
for i in range(t1.shape[0]): # 遍历每一行
temp_row = t1[i, :] # 当前的一行
nan_num = np.count_nonzero(temp_row != temp_row)
if nan_num != 0: # 不为0,说明当前这一列中有nan
temp_not_nan_row = temp_row[temp_row == temp_row] # 当前一行不为nan的array
# 选中当前为nan的位置,把值赋给为不为nan的均值
temp_row[np.isnan(temp_row)] = temp_not_nan_row.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(12).reshape((3, 4)).astype("float")
t1[1, 0:] = np.nan # 给数组第二行赋值
print("原数组:")
print(t1)
t1 = fill_column_ndarray(t1)
print("竖向填充均值:")
print(t1)
print("*" * 25)
t2 = np.arange(12).reshape((3, 4)).astype("float")
t2[:, 2] = np.nan # 给数组的第三列赋值
print("原数组:")
print(t2)
t2 = fill_row_ndarray(t2)
print("横向填充均值:")
print(t2)
原数组:
[[ 0. 1. 2. 3.]
[nan nan nan nan]
[ 8. 9. 10. 11.]]
竖向填充均值:
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
*************************
原数组:
[[ 0. 1. nan 3.]
[ 4. 5. nan 7.]
[ 8. 9. nan 11.]]
横向填充均值:
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
总结
1.Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:
- 修改数组形状
- 翻转数组
- 修改数组维度
- 连接数组
- 分割数组
- 数组元素的添加与删除
2.nan和任何值计算都为nan。
3.axis 为 0 时在水平方向,axis 为 1 时在垂直方向。
以上是关于Python NumPy的使用的主要内容,如果未能解决你的问题,请参考以下文章
python实战应用讲解-numpy专题篇numpy常见函数使用示例(附python示例代码)