Эффективный способ объединения строк двумерного массива в соответствии с заданным списком пар индексов

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Предположим, у меня есть двумерный массив с очень большим количеством строк и список пар индексов этого массива. Я хочу создать новый 2-кратный массив, строки которого являются конкатенациями строк исходного массива, выполненных в соответствии со списком пар индексов. Например:

 a =
 
1 2 3

4 5 6

7 8 9

0 0 0


indexes = [[0,0], [0,1], [2,3]]
  

возвращаемый массив должен быть:

 1 2 3 1 2 3

1 2 3 4 5 6

7 8 9 0 0 0
  

Очевидно, что я могу повторить список индексов, но мой вопрос в том, существует ли более эффективный способ сделать это. Я должен сказать, что список индексов также очень большой.

Ответ №1:

Сначала преобразуйте индексы в массив Numpy:

 ind = np.array(indexes)
  

Затем сгенерируйте свой результат в виде:

 result = np.concatenate([a[ind[:,0]], a[ind[:,1]]], axis=1)
  

Результатом является:

 array([[1, 2, 3, 1, 2, 3],
       [1, 2, 3, 4, 5, 6],
       [7, 8, 9, 0, 0, 0]])
  

Другая возможная формула (с тем же результатом):

 result = np.concatenate([ a[ind[:,i]] for i in range(ind.shape[1]) ], axis=1)
  

Ответ №2:

Вы можете сделать это в одной строке, используя NumPy как:

 a = np.arange(12).reshape(4, 3)
print(a)

b = [[0, 0], [1, 1], [2, 3]]
b = np.array(b)
print(b)

c = a[b.reshape(-1)].reshape(-1, a.shape[1]*b.shape[1])
print(c)

'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

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

[[ 0  1  2  0  1  2]
 [ 3  4  5  3  4  5]
 [ 6  7  8  9 10 11]]
'''
  

Ответ №3:

Вы можете использовать горизонтальную укладку np.hstack :

 c = np.array(indexes)
np.hstack((a[c[:,0]],a[c[:,1]]))
  

вывод:

 [[1 2 3 1 2 3]
 [1 2 3 4 5 6]
 [7 8 9 0 0 0]]