假设我有两个矩阵A和B.
A = rand(4,5,3);
B = rand(4,5,6)
Run Code Online (Sandbox Code Playgroud)
我想应用函数'corr2'来计算相关系数.
corr2(A(:,:,1),B(:,:,1))
corr2(A(:,:,1),B(:,:,2))
corr2(A(:,:,1),B(:,:,3))
...
corr2(A(:,:,1),B(:,:,6))
...
corr2(A(:,:,2),B(:,:,1))
corr2(A(:,:,2),B(:,:,2))
...
corr2(A(:,:,3),B(:,:,6))
Run Code Online (Sandbox Code Playgroud)
如何避免使用循环来创建这样的矢量化?
我有一个矩阵 M1 ,其中每一行都是一个与时间相关的信号。
我还有另一个相同维度的矩阵 M2,其每一行也是一个时间相关信号,用作“模板”,用于识别第一个矩阵中的信号形状。
我想要一个列向量 v,其中 v [i] 是 M1 第 i 行和 M2 第 i 行之间的相关性。
我研究了 numpy 的 corrcoef 函数并尝试了以下代码:
import numpy as np
M1 = np.array ([
[1, 2, 3, 4],
[2, 3, 1, 4]
])
M2 = np.array ([
[10, 20, 30, 40],
[20, 30, 10, 40]
])
print (np.corrcoef (M1, M2))
Run Code Online (Sandbox Code Playgroud)
打印:
[[ 1. 0.4 1. 0.4]
[ 0.4 1. 0.4 1. ]
[ 1. 0.4 1. 0.4]
[ 0.4 1. 0.4 1. ]] …Run Code Online (Sandbox Code Playgroud) 给定一组离散位置(例如"站点"),它们以某些分类方式(例如一般接近度)成对相关并且包含局部级别数据(例如,种群大小),我希望有效地计算本地级别数据之间的平均相关系数.成对位置以相同的关系为特征.
例如,我假设100个站点并使用值1到25随机化它们的成对关系,产生三角矩阵relations:
import numpy as np
sites = 100
categ = 25
relations = np.random.randint(low=1, high=categ+1, size=(sites, sites))
relations = np.triu(relations) # set relation_ij = relation_ji
np.fill_diagonal(relations, 0) # ignore self-relation
Run Code Online (Sandbox Code Playgroud)
我还在每个站点上复制了5000个模拟结果:
sims = 5000
res = np.round(np.random.rand(sites, sims),1)
Run Code Online (Sandbox Code Playgroud)
要计算每个特定关系类别的平均成对相关,我首先计算出每个类别相关i,相关系数rho[j]的模拟结果之间的res每一个独特的网站对j,然后采取所有可能的对平均有关系i:
rho_list = np.ones(categ)*99
for i in range(1, categ+1):
idr = np.transpose(np.where(relations == i)) # pairwise site indices of the same relation category
comp = np.vstack([res[idr[:,0]].ravel(), res[idr[:,1]].ravel()]) …Run Code Online (Sandbox Code Playgroud) 我想计算每个之间的相关列向量矩阵的阿与每个列向量矩阵的乙。
考虑:
vectorsize = 777
A = np.random.rand(vectorsize, 64)
B = np.random.rand(vectorsize, 36)
corr = np.corrcoef(A, B, rowvar=False)
Run Code Online (Sandbox Code Playgroud)
np.corrcoef在这种情况下,的输出将是一个 100x100 的矩阵。这是什么意思?
直觉上我希望得到一个 64x36 的矩阵。
如果我有两个小列表并且我想找到list1中的每个列表与list2 中的每个列表之间的相关性,我可以这样做
from scipy.stats import pearsonr
list1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
list2 = [[10,20,30],[40,50,60],[77,78,79],[80,78,56]]
corrVal = []
for i in list1:
for j in list2:
corrVal.append(pearsonr(i,j)[0])
print(corrVal)
OUTPUT: [1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588, 1.0, 1.0, 1.0, -0.90112711377916588]
Run Code Online (Sandbox Code Playgroud)
效果很好……差不多。(编辑:刚刚注意到我上面的相关输出似乎给出了正确的答案,但它们重复了 4 次。不确定为什么这样做)
但是,对于列表中包含 1000 个值的较大数据集,我的代码无限期冻结,不输出任何错误,因此我每次都强制退出我的 IDE。我在这里滑倒的任何想法?不确定 pearsonr 函数可以处理的数量是否存在固有限制,或者我的编码是否导致了问题。