如何删除多维numpy数组中的全零值行?
解决三维numpy数组删除全零行的方法
你提供的是形状为(3, 4, 4)的三维numpy数组,每个二维子数组的最后两行为全零行,可按照以下步骤删除所有全零行:
方法一(所有子数组非零行数量一致时使用)
这种情况适配你给出的示例数组,处理后仍保持三维结构:
import numpy as np # 你给出的示例数组 a = np.array([[[0.7176471 ,0.45490196 ,1. ,1. ], [0.6509804 ,0.654902 ,0.2509804 ,1. ], [0. ,0. ,0. ,0. ], [0. ,0. ,0. ,0. ]], [[0.58431375 ,0.44705883 ,0.24705882 ,1. ], [0.41960785 ,0.3254902 ,1. ,1. ], [0. ,0. ,0. ,0. ], [0. ,0. ,0. ,0. ]], [[0.23137255 ,0.3137255 ,0.5254902 ,1. ], [0.70980394 ,0.7411765 ,0.5568628 ,1. ], [0. ,0. ,0. ,0. ], [0. ,0. ,0. ,0. ]]]) # 生成保留行的掩码:~表示取反,axis=-1表示沿着最后一个维度判断全零 mask = ~np.all(a == 0, axis=-1) # 过滤后还原三维结构 result = a[mask].reshape(a.shape[0], -1, a.shape[-1])
处理后result的形状为(3, 2, 4),所有全零行已经被删除。
方法二(子数组非零行数量不一致时使用)
如果不同二维子数组的非全零行数量不一样,用列表推导处理,结果为包含多个二维数组的列表:
result = [sub_arr[~np.all(sub_arr == 0, axis=1)] for sub_arr in a]
逻辑说明
np.all(arr == 0, axis=1):判断二维数组中每行的所有元素是否都为0,返回布尔数组,True对应全零行- 取反符
~将布尔值翻转,得到需要保留的非全零行的掩码 - 用掩码索引原数组即可过滤掉全零行
内容的提问来源于stack exchange,提问作者JackSi
相关产品推荐
相关产品推荐

