Ребята взгляните на https://github.com/reinforced/ Reinforced.Typings. Последние несколько дней я играю с шаблонами и t4-шаблонами и заканчиваю этот проект. Это супер-просто и работает как шарм. Просто получите пакет, измените файл конфигурации (это похоже на 10 секунд) и выполните сборку. Все делается автоматически без каких-либо проблем. Благословите автора!
Плохая вещь в шаблонах T4 заключается в том, что после сборки из VS отсканированные сборки блокируются, и вы должны перезапустить VS (как это глупо?). В T4 Toolbox + есть некоторые способы очистки VS, но ни один из них не работал для меня.
На основе this solution
для нахождения корреляционной матрицы между двумя 2D
массивами мы можем иметь аналогичный для нахождения корреляционный вектор, который вычисляет корреляцию между соответствующими строками в двух массивах. Реализация будет выглядеть примерно так:
def corr2_coeff_rowwise(A,B):
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - A.mean(1)[:,None]
B_mB = B - B.mean(1)[:,None]
# Sum of squares across rows
ssA = (A_mA**2).sum(1);
ssB = (B_mB**2).sum(1);
# Finally get corr coeff
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
Мы также можем оптимизировать часть, чтобы получить ssA
и ssB
, введя там магию einsum
!
def corr2_coeff_rowwise2(A,B):
A_mA = A - A.mean(1)[:,None]
B_mB = B - B.mean(1)[:,None]
ssA = np.einsum('ij,ij->i',A_mA,A_mA)
ssB = np.einsum('ij,ij->i',B_mB,B_mB)
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
Прогон образца -
In [164]: M1 = np.array ([
...: [1, 2, 3, 4],
...: [2, 3, 1, 4.5]
...: ])
...:
...: M2 = np.array ([
...: [10, 20, 33, 40],
...: [20, 35, 15, 40]
...: ])
...:
In [165]: corr2_coeff_rowwise(M1, M2)
Out[165]: array([ 0.99411402, 0.96131896])
In [166]: corr2_coeff_rowwise2(M1, M2)
Out[166]: array([ 0.99411402, 0.96131896])
Тест времени выполнения -
In [97]: M1 = np.random.rand(256,200)
...: M2 = np.random.rand(256,200)
...:
In [98]: out1 = np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
...: out2 = corr2_coeff_rowwise(M1, M2)
...: out3 = corr2_coeff_rowwise2(M1, M2)
...:
In [99]: np.allclose(out1, out2)
Out[99]: True
In [100]: np.allclose(out1, out3)
Out[100]: True
In [101]: %timeit np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
...: %timeit corr2_coeff_rowwise(M1, M2)
...: %timeit corr2_coeff_rowwise2(M1, M2)
...:
100 loops, best of 3: 9.5 ms per loop
1000 loops, best of 3: 554 µs per loop
1000 loops, best of 3: 430 µs per loop
20x+
ускорился там, где einsum
над встроенным np.corrcoef
!
, не зная достаточного количества магии массива numpy, я бы просто выделил строки, каждый из них передал каждую пару в corrcoeff
[np.corrcoef(i,j)[0][1] for i,j in zip(a,b)]
для вывода столбца np.array
c, c.shape = np.array([np.corrcoef(i,j)[0][1] for i,j in zip(a,b)]), (a.shape[0], 1)
Я уверен, что лучше использовать функции широковещания / индексирования numpy
Я думаю, что это так: (пожалуйста, исправьте, если не так!) [/ g0]
import numpy as np
M1 = np.array ([
[1, 2, 3, 4],
[2, 3, 1, 4.5]
])
M2 = np.array ([
[10, 20, 33, 40],
[20, 35, 15, 40]
])
v = np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
print (v)
Какие принты:
[ 0.99411402 0.96131896]
Поскольку у него есть только одно измерение, я могу думать об этом как вектор-столбец ...
M1
иM2
в этом случае? – Divakar 18 January 2017 в 10:49corr2_coeff_rowwise2
? – Divakar 18 January 2017 в 11:26