我想找到一个10304 * 280矩阵的协方差(即280个变量,每个都有10304个主题),我正在使用下面的numpy函数来找到它。
cov = numpy.cov(matrix)
结果是我期望208 * 280矩阵,但返回10304 * 10304矩阵。
答案 0 :(得分: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)
答案 1 :(得分: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
标志。阅读相关内容here:
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 == True
或rowvar == False
而有所不同。好吧,事实证明,如果您更改rowvar
标志,numpy只会简单地转置数组本身:P。
看here。
因此,就性能而言,两个版本之间没有任何变化。