2015-01-23 3 views

ответ

0

Один интуитивный способ (хотя неэффективное) было бы создать промежуточный массив нулей, а затем заполнить в каждой строке со значениями в 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] 
+0

Что about: 'np.array ([1,2,3,3,2,1]) * np.arange (1,7)'? :) – cel

+0

@cel Хорошо, это будет работать для конкретного примера OP, но не для общего случая, когда a, b и c являются произвольными. –

+0

Достаточно честный. :) – cel

Смежные вопросы