Я хочу найти корреляцию между двумя списками, и каждый список имеет два массива. Я написал для этого код, но нашел ошибку значения. Как я могу это решить? - PullRequest
0 голосов
/ 10 июля 2020
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 голосов
/ 10 июля 2020

Попробуйте следующее:

slope, intercept, r_value, std_err = scipy.stats.mstats.linregress(x,y)        
0 голосов
/ 10 июля 2020

Попробуйте изменить добавленную часть кода

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?

0 голосов
/ 10 июля 2020

Ошибка находится в строке (которую вы не показываете):

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

Слева у вас 4 переменные. Ошибка говорит, что np.cov(....).flat производит более 4 значений (flat - это numpy.flatiter)

Что дает np.cov(...)? По документам? По вашим собственным тестам кода? Это то, что вам следует проверить!

Если этот вызов cov не является частью вашего кода, вам нужно показать всю трассировку.

= ==

Глядя на функции, я вижу, что np.cov(x,y) вызывается scipy.stats.linregress(x, y), который, в свою очередь, вызывается через rsquared(i,j)

Сообщает нам о i,j, которым вы являетесь прохождение.

Этот блок кода выглядит подозрительно.

Почему добавление в пустой список? Вы смотрели list1 после этого? Правильно ли выглядит i,j, которое вы отправили на rquared?

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? Вы делаете это добавление только один раз, используя last R. Вы не накапливаете эти R значения.

...