我想找到两个列表之间的相关性,并且每个列表都有两个数组。我为此编写了代码,但发现值错误。我该如何解决?

时间:2020-07-10 07:23:53

标签: python arrays numpy correlation

import numpy as np
from scipy import stats
LP_obs = np.loadtxt(fname = "D:\Python_dir\LP_obs.txt")
LP_sim = np.loadtxt(fname = "D:\Python_dir\LP_sim.txt")
LP_obs_1 = np.loadtxt(fname = "D:\Python_dir\LP_obs_1.txt")
LP_sim_1 = np.loadtxt(fname = "D:\Python_dir\LP_sim_1.txt")

def rsquared(x, y):   
    slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
    return r_value**2

list1=[]
list2=[]
list1.append((LP_obs,LP_obs_1)) 
list2.append((LP_sim,LP_sim_1))

for i in list1:
    for j in list2:    
        R=rsquared(i,j)
q=[]
q.append(R)
print(q)

我从.txt文件输入数据。运行代码后,我得到了错误:

File "D:\Anaconda\lib\site-packages\scipy\stats\_stats_mstats_common.py", line 116, in linregress
ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat
ValueError: too many values to unpack (expected 4)

我该如何解决?

3 个答案:

答案 0 :(得分:0)

该错误在该行中(您未显示):

ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat

在左侧,您有4个变量。该错误表明np.cov(....).flat 产生超过4个值(flatnumpy.flatiter

np.cov(...)产生什么?根据文档?根据您自己的代码测试?这些是您应该检查的东西!

如果此cov调用不属于您的代码,则需要显示整个追溯。

===

查看函数,我发现np.cov(x,y)scipy.stats.linregress(x, y)调用,而rsquared(i,j)i,j调用

告诉我们您正在通过的list1

此代码段看起来可疑。

为什么要追加到空列表?此后,您是否看过i,j?您发送给rquared的{​​{1}}看起来正确吗?

list1=[]
list2=[]
list1.append((LP_obs,LP_obs_1)) 
list2.append((LP_sim,LP_sim_1))

for i in list1:
    for j in list2:    
        R=rsquared(i,j)
q=[]
q.append(R)
print(q)

加上q附加功能是什么,它在for循环之外?您只能使用最后 R追加一次。您不是在累积那些R值。

答案 1 :(得分:0)

尝试一下:

slope, intercept, r_value, std_err = scipy.stats.mstats.linregress(x,y)        

答案 2 :(得分:0)

尝试更改代码的附加部分

list1.append(LP_obs)  
list1.append(LP_obs_1)  
list2.append(LP_sim)  
list2.append(LP_sim_1)

我认为您会收到此错误,因为您添加了两个列表的元组,使其成为二维。我认为函数不接受二维数组作为输入。我希望这样做会得到正确的所需答案。

如果上述方法不能解决您的问题,请尝试以下操作:

不能只连接两个一维数组并执行此操作

a1 = np.concatenate((LP_obs,LP_obs_1))
a2 = np.concatenate((LP_sim,LP_sim_1))

def rsquared(x, y):   
    slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
    return r_value**2

R=rsquared(a1,a2)
q=[]
q.append(R)
print(q)

如果这不是您的要求,请说出您要查找哪个r值的列表?

相关问题