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

如何用NumPy和Matplotlib实现两个互补数组的叠加绘图?

实现互补数组生成与可视化

你的核心需求是生成严格互补的两个5×5数组:arr1的NaN位置对应arr2的0,arr1的0位置对应arr2的NaN,再通过Matplotlib可视化。现有代码的问题在于两次独立随机生成数组,无法保证位置完全互补,且循环设置NaN可能出现重复赋值(导致实际NaN数量不足)。

修改后的实现步骤

  1. 高效生成arr1的NaN位置:避免循环重复赋值,直接随机选择10个不重复的索引位置设为NaN
  2. 基于arr1生成互补的arr2:利用布尔掩码直接推导,确保位置严格对应
  3. 可视化优化:通过叠加显示并调整透明度,清晰区分两个数组的有效区域

完整代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# 生成arr1:5x5全0数组,10个随机不重复的NaN位置
arr1 = np.zeros((5, 5))
# 生成10个不重复的线性索引,避免重复赋值
nan_indices = np.random.choice(arr1.size, 10, replace=False)
arr1.flat[nan_indices] = np.nan

# 生成互补的arr2:arr1是NaN的位置设为0,否则设为NaN
arr2 = np.where(np.isnan(arr1), 0, np.nan)

# 定义颜色映射
cmap1 = mcolors.ListedColormap(["lime"])
cmap2 = mcolors.ListedColormap(["hotpink"])

fig, ax = plt.subplots(figsize=(6,6))

# 先绘制arr1的有效区域(0值)
ax.imshow(arr1, cmap=cmap1, vmin=0, vmax=1)
# 叠加绘制arr2的有效区域,设置透明度避免完全覆盖
ax.imshow(arr2, cmap=cmap2, vmin=0, vmax=1, alpha=0.7)

# 添加网格线便于观察5x5结构
ax.set_xticks(np.arange(5)-0.5, minor=True)
ax.set_yticks(np.arange(5)-0.5, minor=True)
ax.grid(which="minor", color="gray", linestyle="-", linewidth=2)
# 隐藏刻度与标签,简化显示
ax.tick_params(which="both", bottom=False, left=False, labelbottom=False, labelleft=False)

plt.show()

关键说明

  • 互补数组生成:np.where(np.isnan(arr1), 0, np.nan)直接复用arr1的NaN掩码,一步生成完全互补的arr2,彻底避免独立随机的不确定性
  • 无重复NaN:np.random.choice(..., replace=False)确保选中的10个位置不重复,保证arr1恰好有10个NaN、15个0
  • 可视化优化:叠加显示时设置alpha=0.7,同时添加网格线,能清晰区分两个数组的区域边界

内容的提问来源于stack exchange,提问作者bobbi_crying_over_programming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:37:21