Ore*_*nin 1 python matlab numpy
在我尝试了网上找到的所有解决方案之后,我必须在这里询问。
我想实现matlab's corr
函数的行为:
我有2个矩阵A和B。A
的形状:(200, 30000)
B的形状:(200, 1)
在 matlab 中,corr(A, B)
将返回一个大小为 (30000, 1) 的矩阵。当我使用numpy.corrcoef
(或dask
为了更好的性能)时,我得到一个非常巨大的 (30001, 30001) 矩阵,并且是错误的答案。我尝试rowvar=False
按照某些答案的建议使用论证,但效果不佳。
我什至尝试过scipy.spatial.distance.cdist(np.transpose(traces), np.transpose(my_trace), metric='correlation')
,它确实按预期返回了 shape(30000, 1) 的矩阵,但这些值与 matlab 中的结果不同。
我迫切需要解决这个问题,请帮忙。
Matlabcorr
默认情况下计算A
和 的列的相关性B
,而 Python 则corrcoef
计算数组内行的相关性(如果向函数传递两个数组,似乎它会对垂直堆叠的数组执行相同的操作)。如果你不关心性能并且需要找到一种简单的方法来做到这一点,你可以水平堆叠两个数组并计算相关性并获得你想要的相应元素:
correlation = np.corrcoef(np.hstack((B,A)),rowvar=False)[0,1:]
Run Code Online (Sandbox Code Playgroud)
但是,如果您更关心性能而不是简单的代码,则需要corr
自己实现该功能。(请评论,如果这是你要找的,我会添加它)
更新:如果您想实现corr
防止额外的计算/内存使用,您可以使用其公式计算相关性,首先对数组进行标准化,然后将它们相乘:
A = (A - A.mean(axis=0))/A.std(axis=0)
B = (B - B.mean(axis=0))/B.std(axis=0)
correlation = (np.dot(B.T, A)/B.shape[0])[0]
Run Code Online (Sandbox Code Playgroud)
示例代码的输出:
A = np.array([1,2,2,2]).reshape(4,1)
B = np.arange(20).reshape(4,5)
Python: np.corrcoef(np.hstack((A,B)),rowvar=False)[0,1:]
[0.77459667 0.77459667 0.77459667 0.77459667 0.77459667]
Matlab: corr(A,B)
0.7746 0.7746 0.7746 0.7746 0.7746
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1446 次 |
最近记录: |