将文本文件读取为包含浮点值的numpy数组
我对Python完全不懂,所以之前看到的类似回答我都没能理解,也没法用上。
我有一个Python脚本想在Unix系统上运行。这个脚本需要一个输入文件,但我不知道怎么确保这个输入文件能被当作numpy浮点数组来读取。
我的输入文件叫做chk.bed,里面只有一列数字。
-bash-4.1$ # head chk.bed
7.25236
0.197037
0.189464
2.60056
0
32.721
11.3978
3.85692
0
0
原始脚本是 -
from scipy.stats import gaussian_kde
import numpy as np
#assume "fpkm" is a NumPy array of log2(fpkm) values
kernel = gaussian_kde(fpkm)
xi = np.linspace(fpkm.min(), fpkm.max(), 100)
yi = kernel.evaluate(xi)
mu = xi[np.argmax(yi)]
U = fpkm[fpkm > mu].mean()
sigma = (U - mu) * np.sqrt(np.pi / 2)
zFPKM = (fpkm - mu) / sigma
到目前为止我能理解的就是要确保脚本能读取这个文件,所以我在代码里加了fpkm = open("chk.bed", 'r')。
但是在执行代码时,我遇到了以下错误 -
Traceback (most recent call last):
File "./calc_zfpkm.py", line 10, in <module>
kernel = gaussian_kde(fpkm)
File "/usr/lib64/python2.6/site-packages/scipy/stats/kde.py", line 88, in __init__
self._compute_covariance()
File "/usr/lib64/python2.6/site-packages/scipy/stats/kde.py", line 340, in _compute_covariance
self.factor * self.factor)
File "/usr/lib64/python2.6/site-packages/numpy/lib/function_base.py", line 1971, in cov
X = array(m, ndmin=2, dtype=float)
TypeError: float() argument must be a string or a number
这似乎表明我没有正确读取文件,因此函数gaussian_kde()无法将这些值当作浮点数读取。
你能帮帮我吗?
谢谢!
2 个回答
这里你可以找到
用于zFPKM标准化的R脚本。
我受到上面提供的Python代码的启发,也可以在这个链接找到相关内容:https://www.biostars.org/p/94680/
install.packages("ks","pracma")
library(ks)
library(pracma)
/* fpkm是一个示例数据 */
fpkm <- c(1,2,3,4,5,6,7,8,4,5,6,5,6,5,6,5,5,5,5,6,6,78,8,89,8,8,8,2,2,2,1,1,4,4,4,4,4,4,4,4,4,4,4,3,2,2,3,23,2,3,23,4,2,2,4,23,2,2,24,4,4,2,2,4,4,4,2,2,4,4,2,2,4,2,45,5,5,5,3,2,2,4,4,4,4,4,4,4,4,4,3,2,2,3,23,2,3,23,4,2,2,4,23,2,2,24,4,4,2,2,4,4,4,2,2,4,4,2,2,4,2,45,5,5,5,3,2,2)
xi=linspace(min(fpkm),max(fpkm),100)
fhat = kde(x=fpkm,gridsize=100,eval.points=xi)
/* 在这里我设置了digits=0。如果我不对数字(yi)进行四舍五入,结果会稍微有些不同。*/
yi=round(fhat$estimate,digits=0)
mu=xi[which.max(yi)]
U=mean(fpkm[fpkm>mu])
sigma=(U-mu)* (sqrt(pi/2))
zFPKM = (fpkm - mu) / sigma
顺便问一下,我有个问题。
我可以对RPKM使用相同的方法吗?
Cankut CUBUK
计算基因组学项目 - 系统基因组实验室
费利佩王子研究中心 (CIPF)
C/ Eduardo Primo Yúfera nº3
46012 瓦伦西亚,西班牙
你现在传递的是一个文件对象给 gaussian_kde
,但它其实需要的是一个NumPy数组。你需要先用 numpy.loadtxt
来把数据加载到一个数组里:
>>> import numpy as np
>>> arr = np.loadtxt('chk.bed')
>>> arr
array([ 7.25236 , 0.197037, 0.189464, 2.60056 , 0. ,
32.721 , 11.3978 , 3.85692 , 0. , 0. ])
>>> gaussian_kde(arr)
<scipy.stats.kde.gaussian_kde object at 0x7f7350390190>