两个NumPy数组的绝对差值

11

有没有一种有效的方法/函数可以从另一个矩阵中减去一个矩阵,并将其绝对值写入新的矩阵中?我可以逐个条目地完成,但对于大矩阵来说,这将相当缓慢...

例如:

X = [[12,7,3],
[4 ,5,6],
[7 ,8,9]]

Y = [[5,8,1],
[6,7,3],
[4,5,9]]

for i in range(len(r_0)):
    for j in range(len(r)):
        delta_r[i][j]= sqrt((r[i][j])**2 - (r_0[i][j])**2)
3个回答

30
如果你想得到两个矩阵的绝对逐元素差异,你可以使用NumPy将它们相减并在结果矩阵上使用numpy.absolute
import numpy as np

X = [[12,7,3],
[4 ,5,6],
[7 ,8,9]]

Y = [[5,8,1],
[6,7,3],
[4,5,9]]

result = np.absolute(np.array(X) - np.array(Y))

输出:

[[7 1 2]
 [2 2 3]
 [3 3 0]]

另外 (虽然不必要),如果你需要在本机Python中执行此操作,则可以使用嵌套列表推导将维度一起压缩。

result = [[abs(a-b) for a, b in zip(xrow, yrow)]
          for xrow, yrow in zip(X,Y)]

输出:

[[7, 1, 2], [2, 2, 3], [3, 3, 0]]

嘿,这个在扩展方面表现如何?如果我想要相减两个像1000x1000那样的numpy数组,它应该相对较快吧? - ScipioAfricanus
1
@ScipioAfricanus 是的,使用更大的矩阵进行矩阵代数正是 NumPy 擅长的。 - miradulo
非常有帮助 :) 谢谢 - alan2here

4

如果将您的2D数组转换为numpy数组,则可轻松完成此操作:

import numpy as np

X = [[12, 7, 3],
     [4,  5, 6],
     [7,  8, 9]]

Y = [[5,  8, 1],
     [6,  7, 3],
     [4,  5, 9]]

X, Y = map(np.array, (X, Y))

result = X - Y

Numpy旨在轻松高效地处理矩阵。
此外,您提到要减去矩阵,但是您似乎也想将各个元素平方,然后对结果取平方根。这在numpy中也很容易实现:
result = np.sqrt((A ** 2) - (B ** 2))

1

我建议使用NumPy

X = numpy.array([
    [12,7,3],
    [4 ,5,6],
    [7 ,8,9]
])

Y = numpy.array([
    [5,8,1],
    [6,7,3],
    [4,5,9]
])

delta_r = numpy.sqrt(X ** 2 - Y ** 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接