如何判断两个ndarray相等?ndarray相等判断最佳实践
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
随着矩阵的维数不断增多,再人工判断两个矩阵是否是相同,就非常的费力气了。所以,这里要对判断两个ndarray
是否完全一致进行程序判断。
大家好,这里是苏南大叔的“程序如此灵动”博客,本文记录numpy
的ndarray
矩阵变量,两个变量是否相等的判断方式。本文测试环境:win10
,python@3.11.0
,numpy@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'>
测试代码:
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
这个方案不靠谱,不要使用!表面上看起来可以。但是,有个案!
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
特殊方案:是否是本体
在本文中,sn2
和sn3
是完全一样的。但是!它们是两个变量,虽然相等,但是不是同一个变量!这种情况下,使用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
文章,请参考:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。