两个2d NumPy数组中一行中所有元素之间的差异



我对编程/Python/NumPy还比较陌生,所以如果我的无知表现出来,我很抱歉。。。

假设我有两个二维NumPy数组:

import numpy as np
a = np.array([[1,   5,              20],
[2,   15,             float("NaN")],
[4,   float("NaN"),   float("NaN")]])
b = np.array([[4,   float("NaN")],
[1,   13],
[5,   float("NaN")]])

我想找出每个矩阵第一行的所有元素之间的差异,每个矩阵第二行的所有元件之间的差异等等

[[  3.  nan  -1.  nan -16.  nan]  # <-- differences between all elements b[0] and a[0]
[ -1.  11. -14.  -2.  nan  nan]  # <-- differences between all elements b[1] and a[1]
[  1.  nan  nan  nan  nan  nan]] # <-- differences between all elements b[2] and a[2]

在使用循环时获得上述结果的一种方法是

outcome = []
for a_row, b_row in zip(a, b):
outcome.append((b_row - a_row[:,None]).flatten())
outcome = np.array(outcome)

然而,有没有一种方法可以在不遍历行的情况下更快地实现这一点?

您可以转置数组以避免子串时的形状差异,然后ravelreshape将结果

arr = b.T[:, None] - a.T
np.ravel([arr[0], arr[1]], 'F').reshape((a.shape[0], a.shape[1] * b.shape[1]))

输出

[[  3.  nan  -1.  nan -16.  nan]
[ -1.  11. -14.  -2.  nan  nan]
[  1.  nan  nan  nan  nan  nan]]

它仍在使用循环,但以列表理解的方式:

np.array([(b_row - a_row[:,None]).flatten() for a_row, b_row in zip(a, b)])

最新更新