Использование Numpy векторизации вместо параллельного зацикливания двух списков - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть два списка или массива неравной длины (скажем, 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]) и так далее. Приведенный ниже код достигает этого, используя для l oop. Но я хочу выяснить, можно ли этого достичь с помощью какого-то NumPy векторизационного, вещательного подхода. обратите внимание, arr_a и arr_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)]

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Чтобы хранить данные в двух столбцах, а не в кортеже (что не очень хорошо подходит для numpy, учитывая, что данные будут объектом, а не цифрой c dtype):

>>> (arr_a - np.array([arr_b[:-1], arr_b[1:]])).T
array([[-4, -4],
       [ 0, -1],
       [-3,  0],
       [-3,  2],
       [ 2, -3],
       [ 1,  6],
       [ 7,  3],
       [ 1, -2],
       [-8, -3],
       [-1,  1]])
2 голосов
/ 08 февраля 2020

Я думаю, вы можете попробовать 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...