首页 > 解决方案 > 使用 Numpy 向量化而不是并行循环两个列表

问题描述

我有两个长度不均匀的列表或数组(比如说arr_a, arr_b)。我想形成第三个元组数组/列表,其中元组的第一个元素取值,元组arr_a[1st element] - arr_b[1st element]的第二个元素取值,arr_a[1st element] - arr_b[2nd element]然后下一个元组取值,(arr_a[2nd_element]-arr_b[2nd_element], arr_a[2nd_element] - arr_b[3rd_element])依此类推。下面的代码使用 for 循环实现了这一点。但我想知道这是否可以通过某种 NumPy 矢量化、广播方法来实现。请注意arr_aarr_b不等长 ( len(arr_b) = len(arr_a)+1)

arr_a = np.random.randint(low = 0,high = 10,size = 10)
arr_b = np.random.randint(low = 0,high = 10,size = 11)

out:
arr_a : [4 8 6 3 3 7 8 6 0 2]
arr_b : [8 8 9 6 1 6 1 5 8 3 1]

list_c = []
for i,j in zip(range(len(arr_a)),range(len(arr_b))):
    list_c.append((arr_a[i]-arr_b[i],arr_a[i]-arr_b[i+1]))

out:
list_c : [(-4, -4), (0, -1), (-3, 0), (-3, 2), (2, -3), (1, 6), (7, 3), (1, -2), (-8, -3), (-1, 1)]

标签: pythonnumpy

解决方案


zip我认为您可以尝试numpy

>>> list(zip(arr_a - arr_b[:-1], arr_a - arr_b[1:]))
[(-4, -4),
 (0, -1),
 (-3, 0),
 (-3, 2),
 (2, -3),
 (1, 6),
 (7, 3),
 (1, -2),
 (-8, -3),
 (-1, 1)]

推荐阅读