在我尝试了网上找到的所有解决方案后,我必须在这里问一下。
我想实现以下行为 matlab's corr
函数。我有两个矩阵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')
确实如预期的那样返回了一个形状为(30000, 1)的矩阵,但数值与matlab中的结果不同。
我急需解决这个问题,请帮助我。
Matlab的Corr函数:我有2个矩阵A和B,A的形状:(200,1)B的形状:(200,30000)在... corr
缺省情况下,计算的是 A
和 B
而Python的 corrcoef
计算一个数组内行的相关性(如果你传给函数两个数组,似乎它对垂直堆叠的数组也会做同样的处理)。如果你不关心性能,需要找一个简单的方法,你可以将两个数组水平堆叠,计算相关性,得到你想要的对应元素。
correlation = np.corrcoef(np.hstack((B,A)),rowvar=False)[0,1:]
但如果你对性能的关注超过了简单的代码,你就需要实现以下功能 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]
示例代码的输出:
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