将文本文件读取为包含浮点值的numpy数组

0 投票
2 回答
4278 浏览
提问于 2025-04-18 14:44

我对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 个回答

-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 瓦伦西亚,西班牙

http://bioinfo.cipf.es

1

你现在传递的是一个文件对象给 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>

撰写回答