前言
最近需要将处理一个Numpy类型的四维数组,有三个任务
1.该数据值为0的数较多,需要先用列均值替换。所以就将值为0的数转换为nan,然后把nan替换为每列非nan的均值。(后面的不需要的话不用管)
2.然后把处理好的四维Numpy数组分别在(1,2),(1,3),(2,3)维度上取均值,也就是分别在三个方向取截面然后求均值,然后水平拼接。
3.然后发现当原始数据中的一列全都为0时,就会计算出nan值,所以就需要对这个二维numpy数组的nan值进行行替换
提示:以下是本篇文章正文内容,下面案例可供参考
一、四维ndarray数据按列取均值
代码如下(示例)其中数据c.shape =(2,2,2,6)。
import numpy as np
# 把0值换为nan后然后用均值替换nan
def del0_and_mean_ndarray(t1):
# 将0替换为nan
t1 = np.where(t1, t1, np.nan)
# print(t1)
# print(t1.shape)
# print('*' * 10)
# nan用对应的列均值替换
for i in range(t1.shape[3]): # 遍历每一列(每一列中的nan替换成该列的均值)
temp_all = t1[:, :, :, i] # 当前的一列
# print(temp_all)
# print('+'*10,i,'+'*10)
for j in range(temp_all.shape[0]):
for k in range(temp_all.shape[1]):
temp_col = temp_all[j, k]
# print(temp_col)
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的ndarray
# 选中当前为nan的位置,把值赋值为不为nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() # mean()表示求均值。
return t1
c = np.array([[[[ 0., 1., 2., 3., 4., 5.],
[ 0., 7., 0, 0, 0, 0]],
[[12., 13., 14., 15., 16., 17.],
[18., 19., 20., 21., 22., 23.]]],
[[[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8, 9, 10, 11]],
[[12., 13, 0, 0, 0, 0],
[18., 19., 20., 21., 22., 23.]]]]
)
print(c)
print(c.shape)
print('*'*10)
print("原始Numpy数组")
print(c)
print(c.shape)
print('*'*10)
c = del0_and_mean_ndarray(c)
print("0替换为nan后并取列平均后的Numpy数组")
print(c)
print(c.shape)
print('*'*10)
运行结果:
二、在三个方向上取截面(俩个维度)然后求均值然后拼接
代码如下(示例)上个代码后面添加 c.shape =(2,10)
print("取截面平均并水平拼接后的Numpy数组")
c1 = c.mean(axis=(1,2)).reshape(2,-1)
c2 = c.mean(axis=(1,3)).reshape(2,-1)
c3 = c.mean(axis=(2,3)).reshape(2,-1)
print(c1)
print(c2)
print(c3)
c = np.hstack((c1, c2, c3))
print('*'*10)
运行结果:
三、在三个方向取俩个维度截面然后求均值
代码如下(示例)继续后面添加
def fill_ndarray(t1):
for i in range(t1.shape[0]): # 遍历每一行(每一行中的nan替换成该列的均值)
temp_rol = t1[i, :] # 当前的一行
nan_num = np.count_nonzero(temp_rol != temp_rol)
if nan_num != 0: # 不为0,说明当前这一行中有nan
temp_not_nan_rol = temp_rol[temp_rol == temp_rol] # 去掉nan的ndarray
# 选中当前为nan的位置,把值赋值为不为nan的均值
temp_rol[np.isnan(temp_rol)] = temp_not_nan_rol.mean() # mean()表示求均值。
return t1
print("对拼接好的numpy矩阵再次进行 行平均")
c = fill_ndarray(c)
print(c)
print(c.shape)
运行结果:
四、结论
主要用到了nan值替换为均值 包括二维以及多维,二维很常见,多维就不容易找到代码
第二个就是在如axis=(1,2)俩个维度上取截面均值,而不单纯是一个维度上求均值。
该代码主要面向自己写的项目,如果对大家有所帮助还是很荣幸的
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99638.html