#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]]