我对编程/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)
然而,有没有一种方法可以在不遍历行的情况下更快地实现这一点?
您可以转置数组以避免子串时的形状差异,然后ravel
和reshape
将结果
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)])