0

我想找到一个 10304*280 矩阵的协方差(即 280 个变量,每个都有 10304 个主题),我正在使用以下 numpy 函数来找到它。

cov = numpy.cov(matrix)

结果我预计为 208*280 矩阵,但它返回 10304*10304 矩阵。

4

2 回答 2

0

这是numpy.cov(m, y=None..)文件所说的

m : array_like 包含多个变量和观察值的一维或二维数组。m 的每一行代表一个变量每一列都是对所有这些变量的一次观察......

因此,如果您的矩阵包含 280 个变量,每个变量有 10304 个样本,则假设是 280*10304 矩阵而不是 10304*280 一个。简单的解决方案将与其他人建议的相同。

swap_matrix = numpy.swapaxis(matrix)
cov = numpy.cov(swap_matrix)
于 2018-09-20T18:39:09.107 回答
0

如上一个答案中所建议的,您可以更改内存布局。在 2d 中执行此操作的一种简单方法是简单地转置矩阵:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r.T).shape # is (10,10)

但您也可以指定一个rowvar标志。在这里阅读:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r, rowvar=False).shape # is (10,10)

我认为特别是对于大型矩阵,这可能会更高效,因为您避免了轴的交换/转置。

更新:

我想到了这一点,想知道算法是否真的取决于rowvar == Trueor rowvar == False。好吧,事实证明,如果您更改rowvar标志,numpy 只是转置数组本身:P。

这里

因此,就性能而言,两个版本之间不会发生任何变化。

于 2018-09-20T18:42:19.487 回答