使用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的同一个单元格中执行以下代码,确认问题:
- 检查是否共享内存:
print(np.shares_memory(sudoku, self.start_sudoku)),返回True则确认是浅拷贝问题 - 直接打印当前的数组差异:
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
相关产品推荐
相关产品推荐

