多维Numpy数组将nan替换为每列均值 以及同时在2个维度上取均值方法(截面均值)

导读:本篇文章讲解 多维Numpy数组将nan替换为每列均值 以及同时在2个维度上取均值方法(截面均值),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

最近需要将处理一个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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!