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

使用Numpy的array_equal对比两个不同数组始终返回True是什么原因

问题根因

你遇到的问题90%以上是numpy数组浅拷贝共享内存导致的,剩下的小概率是Jupyter单元格执行顺序混乱、变量缓存未刷新:

  • 你在给sudoku赋值时大概率直接写了类似sudoku = self.start_sudoku的代码,numpy数组的直接赋值是浅拷贝,两个变量会指向同一块内存地址,你修改sudoku的数值时,self.start_sudoku也会被同步修改,你看到的打印结果可能是修改前的旧输出,实际对比时两个数组已经完全一致了。
  • Jupyter支持乱序执行单元格,如果你先打印了两个数组的内容,之后才修改了数组、执行对比逻辑,打印的旧结果和当前变量实际值不一致,就会出现看起来数值不同但对比返回True的错觉。
  • 极小概率是两个数组为np.ma.MaskedArray类型,掩码隐藏了实际相同的数值,不过普通场景很少遇到。
验证方法

你可以在调用np.array_equal的同一个单元格中执行以下代码,确认问题:

  1. 检查是否共享内存:print(np.shares_memory(sudoku, self.start_sudoku)),返回True则确认是浅拷贝问题
  2. 直接打印当前的数组差异:print(np.where(sudoku != self.start_sudoku)),如果输出为空元组,说明两个数组当前确实完全一致
解决方案
  • 初始化新数组时强制做深拷贝,把赋值语句改成sudoku = self.start_sudoku.copy()或者sudoku = np.copy(self.start_sudoku),保证两个数组内存独立,修改新数组不会影响原数组。
  • 调试前先重启Jupyter内核,按顺序重新执行所有单元格,避免旧变量缓存干扰结果。

附错误/正确代码示例:

import numpy as np
# 错误写法
start_sudoku = np.array([[1,0,4],[2,0,5]])
sudoku = start_sudoku # 浅拷贝,共享内存
sudoku[0,1] =7
print(np.array_equal(sudoku, start_sudoku)) # 输出True,start_sudoku也被修改为7

# 正确写法
start_sudoku = np.array([[1,0,4],[2,0,5]])
sudoku = start_sudoku.copy() # 深拷贝,内存独立
sudoku[0,1] =7
print(np.array_equal(sudoku, start_sudoku)) # 输出False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:39:03