You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除多维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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:36:01