测试两个numpy 2d数组的相等性

时间:2016-04-24 19:40:37

标签: python arrays numpy matrix

我一直在尝试将各个元素从一个2D数组复制到另一个2D数组。我的代码如下:

tp_matrix = np.array(tp_matrix)
my_array = np.empty(shape = (tp_matrix.shape))

for x in range(tp_matrix.shape[0]):
    for y in range(tp_matrix.shape[1]):
        my_array[x][y] = tp_matrix[x][y]


if(np.array_equal(my_array, tp_matrix)):
    print('Equal')
else:
    print('Not equal')

然而,由于某种原因,这两个阵列并不相同。这里有什么问题,我该怎么做才能解决它?

我不能使用numpy的复制功能,因为我想稍后对my_array中的某些元素进行修改,其他值与my_matrix的值相同。

编辑:在运行代码时,我收到以下消息: FutureWarning:元素比较失败;返回标量,但将来会执行元素比较 这是否意味着数据集(tp_matrix)出现了问题?

编辑2:我尝试过allclose和isclose函数,但是我收到了这个错误: TypeError:输入类型不支持ufunc'isfinite',根据强制转换规则''safe',输入无法安全地强制转换为任何支持的类型 数据存储为浮点数。它也有点大(399 x 5825)。

编辑3:解决了。我不得不重新安装python。

2 个答案:

答案 0 :(得分:3)

使用np.allclose来测试float数组的(几乎)相等性,因为浮点数在计算机中的表示方式。

有关详情,请参阅"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

答案 1 :(得分:0)

我试图模仿您的体验并做了以下事情:

one = np.array([1,2,3])
two = np.array([one,one,one])
three = np.empty(shape=(two.shape))
for x in range(two.shape[0]):
    for y in range(two.shape[1]):
        three[x][y] = two[x][y]

打印'二'的内容。和'三'给出以下结果

print(three)
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])
print(two)
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

虽然对于这个小例子,如果我使用np.array_equal测试相等性,numpy会返回True,但在你的情况下,舍入错误可能导致测试为False。

解决方法可能是以下测试:

sum(sum(two==three)) == two.shape[0]*three.shape[1]

虽然可能有更有效的方法。