Один интуитивный способ (хотя неэффективное) было бы создать промежуточный массив нулей, а затем заполнить в каждой строке со значениями в a
, b
, c
, ... с соответствующим сдвигом столбца. Если у вас есть этот массив, вы можете просто просуммировать строки, чтобы получить результат, который вы хотите:
import numpy as np
a = np.array((1,2,3,4))
b = np.array((2,3,4,5))
c = np.array((3,4,5,6))
arr_list = [a, b, c]
nr = len(arr_list)
row_lengths = [len(aa) for aa in arr_list]
nc = np.max(row_lengths) + nr - 1
digits = np.zeros((nr, nc), a.dtype)
for ii, aa in enumerate(arr_list):
digits[ii, ii:(ii + row_lengths[ii])] = aa
print(digits)
# [[1 2 3 4 0 0]
# [0 2 3 4 5 0]
# [0 0 3 4 5 6]]
print(digits.sum(0))
# [ 1 4 9 12 10 6]
Более быстрый метод будет вычислять выход непосредственно, без создания промежуточного 2D массива
out = np.zeros(np.max(row_lengths) + nr - 1, a.dtype)
for ii, aa in enumerate(arr_list):
out[ii:(ii + row_lengths[ii])] += aa
print(out)
# [ 1 4 9 12 10 6]
Что about: 'np.array ([1,2,3,3,2,1]) * np.arange (1,7)'? :) – cel
@cel Хорошо, это будет работать для конкретного примера OP, но не для общего случая, когда a, b и c являются произвольными. –
Достаточно честный. :) – cel