Python 查找两个numpy数组之间的差异

Python 查找两个numpy数组之间的差异,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我有两个数组,都来自文本文件。通过观察,它看起来完全一样。然而,当我测试这两个数组的等价性时,它们失败了——元素方面、形状方面等等。。我用numpy测试回答 这是两个 我想知道这两个阵列之间是否真的存在差异,如果没有,是什么导致了故障。它们不相等,它们有54个不同的元素 np.sum(x!=y) 54 要查找不同的元素,可以执行以下操作: np.where(x!=y) (array([ 1, 5, 7, 11, 19, 24, 32, 48, 82, 92, 9

我有两个数组,都来自文本文件。通过观察,它看起来完全一样。然而,当我测试这两个数组的等价性时,它们失败了——元素方面、形状方面等等。。我用numpy测试回答

这是两个


我想知道这两个阵列之间是否真的存在差异,如果没有,是什么导致了故障。

它们不相等,它们有54个不同的元素

np.sum(x!=y)

54
要查找不同的元素,可以执行以下操作:

np.where(x!=y)


(array([  1,   5,   7,  11,  19,  24,  32,  48,  82,  92,  97, 111, 114,
        119, 128, 137, 138, 146, 153, 154, 162, 165, 170, 186, 188, 204,
        215, 246, 256, 276, 294, 300, 305, 316, 318, 333, 360, 361, 390,
        419, 420, 421, 423, 428, 429, 429, 439, 448, 460, 465, 467, 471,
        474, 487]),
 array([18, 18, 18, 17, 17, 16, 15, 12,  8,  6,  5,  4,  3,  3,  2,  1,  1,
        26,  0, 25, 24, 24, 24, 23, 22, 20, 20, 17, 16, 14, 11, 11, 11, 10,
        10,  9,  7,  7,  5,  1,  1,  1, 26,  1,  0, 25, 23, 21, 19, 18, 18,
        17, 17, 14]))

它们并不相等,它们有54种不同的元素

np.sum(x!=y)

54
要查找不同的元素,可以执行以下操作:

np.where(x!=y)


(array([  1,   5,   7,  11,  19,  24,  32,  48,  82,  92,  97, 111, 114,
        119, 128, 137, 138, 146, 153, 154, 162, 165, 170, 186, 188, 204,
        215, 246, 256, 276, 294, 300, 305, 316, 318, 333, 360, 361, 390,
        419, 420, 421, 423, 428, 429, 429, 439, 448, 460, 465, 467, 471,
        474, 487]),
 array([18, 18, 18, 17, 17, 16, 15, 12,  8,  6,  5,  4,  3,  3,  2,  1,  1,
        26,  0, 25, 24, 24, 24, 23, 22, 20, 20, 17, 16, 14, 11, 11, 11, 10,
        10,  9,  7,  7,  5,  1,  1,  1, 26,  1,  0, 25, 23, 21, 19, 18, 18,
        17, 17, 14]))

你应该先用一个更小更简单的矩阵来测试你的函数

例如:

import numpy as np
from io import StringIO



class TextMatrixAssertions(object):
    def assertArrayEqual(self, dataX, dataY):
        x = np.loadtxt(dataX)
        y = np.loadtxt(dataY)

        if not np.array_equal(x, y):
            raise Exception("array_equal fail.")

        if not np.array_equiv(x, y):
            raise Exception("array_equiv fail.")

        if not np.allclose(x, y):
            raise Exception("allclose fail.")

        return True

a = StringIO(u"0 1\n2 3")
b = StringIO(u"0 1\n2 3")
test = TextMatrixAssertions()
test.assertArrayEqual(a,b)
输出

True
所以我猜你的问题是你的文件,而不是你的代码。您还可以尝试在x和y中加载相同的文件并查看输出

要查看哪些元素不同,可以尝试使用
not_equal

范例

a = StringIO(u"0 1\n2 3")
c = StringIO(u"0 1\n2 4")
x = np.loadtxt(a)
y = np.loadtxt(c)
np.not_equal(x,y)

Output

array([[False, False],
       [False,  True]])

你应该先用一个更小更简单的矩阵来测试你的函数

例如:

import numpy as np
from io import StringIO



class TextMatrixAssertions(object):
    def assertArrayEqual(self, dataX, dataY):
        x = np.loadtxt(dataX)
        y = np.loadtxt(dataY)

        if not np.array_equal(x, y):
            raise Exception("array_equal fail.")

        if not np.array_equiv(x, y):
            raise Exception("array_equiv fail.")

        if not np.allclose(x, y):
            raise Exception("allclose fail.")

        return True

a = StringIO(u"0 1\n2 3")
b = StringIO(u"0 1\n2 3")
test = TextMatrixAssertions()
test.assertArrayEqual(a,b)
输出

True
所以我猜你的问题是你的文件,而不是你的代码。您还可以尝试在x和y中加载相同的文件并查看输出

要查看哪些元素不同,可以尝试使用
not_equal

范例

a = StringIO(u"0 1\n2 3")
c = StringIO(u"0 1\n2 4")
x = np.loadtxt(a)
y = np.loadtxt(c)
np.not_equal(x,y)

Output

array([[False, False],
       [False,  True]])

还有一个解决方案。可以看到不相等元素的值。如果运行下面的代码,您将看到具有nan值的元素不相等,因此导致引发异常

import numpy as np

class TextMatrixAssertions(object):
    def assertArrayEqual(self, dataX, dataY):
        x = np.loadtxt(dataX)
        y = np.loadtxt(dataY)

        if not np.array_equal(x, y):
            not_equal_idx = np.where(x != y)
            for idx1, idx2 in zip(not_equal_idx[0],not_equal_idx[1]):
                print(x[idx1][idx2])
                print(y[idx1][idx2])
            raise Exception("array_equal fail.")

        if not np.array_equiv(x, y):
            raise Exception("array_equiv fail.")

        if not np.allclose(x, y):
            raise Exception("allclose fail.")

dataX = "MyMatrix.txt"
dataY = "MyMatrix2.txt"
test = TextMatrixAssertions()
test.assertArrayEqual(dataX, dataY)
输出:

nan
nan
nan
...
nan

还有一个解决方案。可以看到不相等元素的值。如果运行下面的代码,您将看到具有nan值的元素不相等,因此导致引发异常

import numpy as np

class TextMatrixAssertions(object):
    def assertArrayEqual(self, dataX, dataY):
        x = np.loadtxt(dataX)
        y = np.loadtxt(dataY)

        if not np.array_equal(x, y):
            not_equal_idx = np.where(x != y)
            for idx1, idx2 in zip(not_equal_idx[0],not_equal_idx[1]):
                print(x[idx1][idx2])
                print(y[idx1][idx2])
            raise Exception("array_equal fail.")

        if not np.array_equiv(x, y):
            raise Exception("array_equiv fail.")

        if not np.allclose(x, y):
            raise Exception("allclose fail.")

dataX = "MyMatrix.txt"
dataY = "MyMatrix2.txt"
test = TextMatrixAssertions()
test.assertArrayEqual(dataX, dataY)
输出:

nan
nan
nan
...
nan


打印您的值可能会使它们看起来相同?我会尝试进行
打印(repr(x))
打印(repr(y))
,看看这是否能更清楚地说明值之间的差异。尝试打印“当传递给eval()时将产生具有相同值的对象的字符串”。您确实意识到您的
raise
语句会中止方法的执行,对吗?因此,如果
array_equal()
返回
False
,则永远不会到达
allclose()
。是的,我会注释其他值以检查其他值。打印您的值可能会使它们看起来相同?我会尝试进行
打印(repr(x))
打印(repr(y))
,看看这是否能更清楚地说明值之间的差异。尝试打印“当传递给eval()时将产生具有相同值的对象的字符串”。您确实意识到您的
raise
语句会中止方法的执行,对吗?因此,如果
array_equal()
返回
False
,则永远不会到达
allclose()
。是的,我对其他内容进行注释以检查其他内容。如何查找它们的索引?如何查找它们的索引?是的。我知道函数没有问题,因为我在测试的其他阵列上使用它。但是对于这个特殊的矩阵,我看不出它们的区别。然后用not_equal函数来看看哪些元素是不同的。我知道函数没有问题,因为我在测试的其他阵列上使用它。但是对于这个特定的矩阵,我就是看不出它们的区别。然后用not_equal函数来看看哪些元素是不同的。这是不必要的复杂。@Nils Werner,你能解释一下为什么这么复杂吗?这样做的目的是向OP解释为什么他的代码没有像他预期的那样运行。我的代码是如何使理解变得复杂的?使用索引访问不同的元素不是最有效的,for循环的
是不必要的,并且使用
x[i][j]
糟糕的样式可能会产生意想不到的后果。我不理解您的意思。也许你指的是一些输入文件为空或长度不同的情况。然而,对于OP提供的输入,以及为了解释代码引发异常的原因,我的代码完成了这项工作。是的,它只是不必要的复杂:-)
idx=x!=Yprint(x[idx],y[idx])
也一样,但更简单、更快。这是不必要的复杂。@Nils-Werner,你能解释一下为什么这么复杂吗?这样做的目的是向OP解释为什么他的代码没有像他预期的那样运行。我的代码是如何使理解变得复杂的?使用索引访问不同的元素不是最有效的,for
循环的
是不必要的,并且使用
x[i][j]
糟糕的样式可能会产生意想不到的后果。我不理解您的意思。也许你指的是一些输入文件为空或长度不同的情况。然而,对于OP提供的输入,以及为了解释代码引发异常的原因,我的代码完成了这项工作。是的,它只是不必要的复杂:-)
idx=x!=Y打印(x[idx],y[idx])
的操作与此相同,但更简单、更快。