import numpy as np
arr1 = [1,2,3,4]
arr2 = [5,6,7,8]
#arr2 = [1,1,1]
print("convolved:", np.convolve(arr1, arr2))
outer = np.outer(arr1, arr2)
print("outer:\n", outer)
outerFlipped = np.fliplr(outer)
print(np.trace(outerFlipped, 0)) #primary diagonal
#np.trace(outerFlipped, 1)
# convolve using traces
convolveTrace = [np.trace(np.fliplr(outer), i) for i in range(-4,4)]
print("convolveTrace:\n", convolveTrace)
# convolve using diagonal sums
np.sum(np.diag(np.fliplr(outer), -4))
"""
# equivalent means of doing convolution
(arr1, arr2)
|> np.convolve
# outer product, flip left to right, diag and then sum
(arr1, arr2)
|> np.outer
|> np.fliplr
|> np.diag(, -len to len)
|> np.sum
# trace gives the same thing as diag and then sum
(arr1, arr2)
|> np.outer
|> np.fliplr
|> np.trace(, -len to len)
# explicitly form array of diagonal elements as a matrix, and take row sums
(arr1, arr2)
|> np.outer
|> np.fliplr
|> diags = [np.pad(np.diag(outerFlip, i), (0, abs(i))) for i in range(-4,4)]
|> np.concatenate(diags).reshape(8,4)
|> np.sum(diagsArr, 1)
"""
import numpy as np
arr1 = [1,2,3,4]
arr2 = [5,6,7,8]
outerFlip = np.fliplr(np.outer(arr1, arr2))
# np.diag(outerFlip, 0)
diags = [np.pad(np.diag(outerFlip, i), (0,abs(i))) for i in range(-4,4)]
#np.sum(diags, 1)
diagsArr = np.concatenate(diags).reshape(8,4)
np.sum(diagsArr, 1)