我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

随着矩阵的维数不断增多,再人工判断两个矩阵是否是相同,就非常的费力气了。所以,这里要对判断两个ndarray是否完全一致进行程序判断。

苏南大叔:如何判断两个ndarray相等?ndarray相等判断最佳实践 - ndarray是否相等
如何判断两个ndarray相等?ndarray相等判断最佳实践(图3-1)

大家好,这里是苏南大叔的“平行空间笔记本”博客,本文记录numpyndarray矩阵变量,两个变量是否相等的判断方式。本文测试环境:win10python@3.11.0numpy@1.24.2

标的变量

这里先获得标的变量,龙套角色。

import numpy as np
sn  = np.array([["苏", "南"], ["大", "叔"]])
sn2 = np.array([["苏", "大"], ["南", "叔"]])
sn3 = sn.T

如何理解.T,可以参考:

传统双等号判断失败【不推荐】

如果使用传统的==来做判断的话,会得到一个报错信息。说实话,这很意外,万能的双等号居然失败了!直接输出sn == sn2的结果的话,可以看到:这个双等号的结果居然是个ndarray类型的数组!真心是让人意外!

print( sn==sn2 )
print( type(sn==sn2) )

输出结果:

[[ True False]
 [False  True]] 
<class 'numpy.ndarray'>

苏南大叔:如何判断两个ndarray相等?ndarray相等判断最佳实践 - 双等号判断
如何判断两个ndarray相等?ndarray相等判断最佳实践(图3-2)

测试代码:

if (sn == sn2) :
    print("ok")

报错结果:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
双等号判断改成三等号判断的话,直接语法错误。

方案一:(s==n).all()【不推荐】

print( (sn == sn2).all() )     # False
print( (sn == sn3).all() )     # False
print( (sn2 == sn3).all() )    # True

输出:

False
False
True

苏南大叔:如何判断两个ndarray相等?ndarray相等判断最佳实践 - 正确的判断方法
如何判断两个ndarray相等?ndarray相等判断最佳实践(图3-3)

这个方案不靠谱,不要使用!表面上看起来可以。但是,有个案!

import numpy as np
s = np.array([[1,2,3]])
n = np.array([1,2,3])
print( (s == n).all() )        # True
print( np.array_equal(s, n) )  # False

方案二:np.array_equal(s,n)【推荐】

print( np.array_equal(sn, sn2) )     # False
print( np.array_equal(sn, sn3) )     # False
print( np.array_equal(sn2, sn3) )    # True

输出:

False
False
True

特殊方案:是否是本体

在本文中,sn2sn3是完全一样的。但是!它们是两个变量,虽然相等,但是不是同一个变量!这种情况下,使用is来断言。

import numpy as np
sn = np.array([["苏", "南"], ["大", "叔"]])
sn2 = np.array([["苏", "大"], ["南", "叔"]])
sn3 = sn.T           # 这个也是两个变量哦
sn4 = sn3
sn5 = sn3.copy()

print(sn is sn2)     # False
print(sn is sn3)     # False
print(sn2 is sn3)    # False
print(sn3 is sn.T)   # False
print(sn3 is sn4)    # True
print(sn3 is sn5)    # False

其它方案

由于ndarray类型的特殊性,也可以从其它角度(比如:.ndim.size.shape)等等角度进行不相等判断。所以,不排除存在其它合理方案的可能性。这里就暂时不做谈论了。

结束语

更多苏南大叔的python文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python