如何创建与含多数组列表同形状的0-1数组并指定元素置0
问题解决:创建与数组列表同形状的0-1掩码数组
原代码失效的核心原因是**y是Python列表而非numpy数组**:执行y == -100.时,是将列表中的每个子数组整体与标量-100做比较,得到的是[False, False, False]这样的布尔列表,无法定位到具体元素,因此赋值操作x[y == -100.] = 0根本不会修改任何元素。
正确实现方法(保持numpy数组结构)
由于所有子数组尺寸一致,先将列表转换为三维numpy数组,再进行元素级的比较和赋值:
import numpy as np y = ([np.array([[1., 0., 0.], [0., 0., 1.], [0., 0., 1.]], dtype='float32'), np.array([[0., 0., 1.], [0., 0., 1.], [1., 0., 0.]], dtype='float32'), np.array([[ 0., 0., 1.], [ 1., 0., 0.], [-100., -100., -100.]], dtype='float32')]) # 将列表转换为三维numpy数组 y_np = np.array(y) # 创建同形状的全1数组 x = np.ones_like(y_np) # 将等于-100的位置设为0 x[y_np == -100.] = 0 print(x)
输出结果
array([[[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], [[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], [[1., 1., 1.], [1., 1., 1.], [0., 0., 0.]]], dtype=float32)
保持Python列表结构的替代方案
如果需要最终结果保持原列表的结构(而非三维numpy数组),可以遍历每个子数组单独处理:
x = [] for arr in y: mask = np.ones_like(arr) mask[arr == -100.] = 0 x.append(mask) # 查看结果 for sub_arr in x: print(sub_arr)
输出的x是包含3个(3,3)数组的列表,其中第三个数组的最后一行全为0,完全符合需求。
内容的提问来源于stack exchange,提问作者sergey_208
相关产品推荐
相关产品推荐

