我需要在scipy pearsonr函数中包括丢失的数据。问题是如果我从文件中读取例如'NA',那么我不能将其转换为浮点数,以便numpy接受。如果我用numpy读取它,则带有'NA'值的灵活数组类型不能与'dropna'或类似的东西一起使用。我如何才能接受丢失的数据?我已经阅读了有关数据掩码的信息,但是我不明白如何在代码中使用它。
谢谢
#!/usr/bin/env python
import sys
import scipy.stats as sp
import numpy as np
f1=open(sys.argv[1],'r')
f2=open(sys.argv[2],'r')
g=open(sys.argv[3],'w')
f1.readline()
otus=[]
metanames=[]
result={}
for i in f1:
k1=i.split("\t")
k1[-1]=k1[-1].rstrip("\n")
otu=k1[0]
f2.seek(0)
result[otu]=[]
f2.readline()
for j in f2:
k2=j.split("\t")
k2[-1]=k2[-1].rstrip("\n")
if k2[0] not in metanames:
metanames.append(k2[0])
x=np.asarray(k1[1:])
y=np.asarray(k2[1:])
corr = sp.pearsonr(x, y)
result[otu].append(str(corr))
g.write("\t"+"\t".join(str(p) for p in metanames)+"\n")
for i in result.keys():
g.write(i+"\t"+"\t".join(str(p) for p in result[i][0])+"\n")
TypeError:无法使用灵活类型执行归约
答案 0 :(得分:0)
我不确定我是否理解您的问题。一个最小的例子 会有所帮助。但是我想您会得到类似以下的内容:
>>> x = np.array([[ 1., 2., 3.], [ 4., 5., 6.], [ 7., 8., 9.]]).astype('object')
>>> x[0,1] = 'NA'
>>> x[2,2] = 'NA'
>>> x
array([[1.0, 'NA', 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 'NA']], dtype=object)
因此,由于存在'NA',因此您有一个numpy类型的对象数组。
>>> x.astype('float')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'NA'
这就是为什么您不能将其转换为float?所以你有 要做的就是用NaN代替'NA'
>>> x[x=='NA'] = np.nan
>>> x
array([[1.0, nan, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, nan]], dtype=object)
>>> x.astype('float')
array([[ 1., nan, 3.],
[ 4., 5., 6.],
[ 7., 8., nan]])
答案 1 :(得分:0)
好吧,所以我完全避免使用numpy,而只是从两个数组中手动删除了'nan'和相应的值..到目前为止,这变得更加轻松快捷,应该绕开它。
S。
f1=open(sys.argv[1],'r')
f2=open(sys.argv[2],'r')
g=open(sys.argv[3],'w')
f1.readline()
otus=[]
metanames=[]
result={}
for i in f1:
k1=i.split("\t")
k1[-1]=k1[-1].rstrip("\n")
otu=k1[0]
if otu not in otus:
otus.append(otu)
f2.seek(0)
result[otu]=[]
f2.readline()
for j in f2:
k2=j.split("\t")
k2[-1]=k2[-1].rstrip("\n")
if k2[0] not in metanames:
metanames.append(k2[0])
x=k1[1:]
y=k2[1:]
c=-1
while c< len(x):
if x[c]=='NaN' or y[c]=='NaN':
del x[c]
del y[c]
else:
x[c]=float(x[c])
y[c]=float(y[c])
c=c+1
corr = sp.pearsonr(x, y)
result[otu].append(corr[0])
g.write("\t"+"\t".join(str(p) for p in metanames)+"\n")
for i in result.keys():
g.write(i)
for z in result[i]:
g.write("\t"+str(z))
g.write("\n")