#python #arrays #performance
Вопрос:
Я хочу добавить два numpy-массива разных размеров, начиная с определенного индекса. Поскольку мне нужно сделать это пару тысяч раз с большими массивами, это должно быть эффективным, и я не уверен, как сделать это эффективно, не перебирая каждую ячейку.
a = [5,10,15]
b = [0,0,10,10,10,0,0]
res = add_arrays(b,a,2)
print(res) => [0,0,15,20,25,0,0]
наивный подход:
# b is the bigger array
def add_arrays(b, a, i):
for j in range(len(a)):
b[i j] = a[j]
Ответ №1:
Вы можете назначить меньшую единицу в массив нулей, а затем добавить, я бы сделал это следующим образом
import numpy as np
a = np.array([5,10,15])
b = np.array([0,0,10,10,10,0,0])
z = np.zeros(b.shape,dtype=int)
z[2:2 len(a)] = a # 2 is offset
res = z b
print(res)
вывод
[ 0 0 15 20 25 0 0]
Отказ от ответственности: я предполагаю, что смещение len(a)
всегда меньше или равно len(b)
.
Комментарии:
1. спасибо за ваш быстрый ответ!
Ответ №2:
В вашем подходе нет ничего плохого. Вы не можете получить лучшую асимптотическую временную или пространственную сложность. Если вы хотите уменьшить количество строк кода (что не является самоцелью), вы можете использовать назначение фрагментов и некоторые другие утилиты:
def add_arrays(b, a, i):
b[i:i len(a)] = map(sum, zip(b[i:i len(a)], a))
Но функциональные накладные расходы должны сделать это менее производительным, во всяком случае.
Некоторые документы:
Ответ №3:
Это должно быть быстрее, чем ответ Daweo, в 1,5-5 раз (в зависимости от соотношения размеров между a и b).
result = b.copy()
result[offset: offset len(a)] = a