Digamos que temos uma matriz como:
a = np.array([
[k11, k12, k13, k14, k15, k16, k17, k18],
[k21, k22, k23, k24, k25, k26, k27, k28],
[k31, k32, k33, k34, k35, k36, k37, k38],
[k41, k42, k43, k44, k45, k46, k47, k48]
])
const = C
Preciso criar um vetor a partir desta matriz como este (runge kutta 4):
result = np.array([
const * (k11 + 2*k21 + 2*k31 + k41),
const * (k12 + 2*k22 + 2*k32 + k42),
const * (k13 + 2*k23 + 2*k33 + k43),
....
const * (k18 + 2*k28 + 2*k38 + k48)
])
Eu consigo fazer isso em ciclo, mas tenho certeza de que os métodos numpy permitem isso em formato vetorizado.
const * np.asarray([1, 2, 2, 1])
.@
.Observe que fornecer um exemplo mínimo e reproduzível ajudaria a comparar a equivalência da minha solução e da sua.
Ficou fácil em poucos passos:
np.einsum
solução:ij,i
são as dimensões dea
e os coeficientes. O resultado,j
está faltandoi
, o que significa que essa dimensão é multiplicada e somada entre os arrays.Esta solução é boa porque é muito explícita sobre dimensões sem exigir nenhuma remodelação ou transposição. Para matrizes maiores ou cadeias de multiplicação mais longas, a ordem das operações será otimizada para velocidade.