2016-04-03 86 views
3

循环需要一些帮助Python代码和一些数组:虽然与某些阵列条件

我有一个txt文件,看起来像这样:

1 1 6 
1 2 65 
1 3 23 
2.3 2 43 
2.3 4 23 
3.1 4 45 
3.1 6 35 
3.1 7 15 
5 3 67 
5 9 45 

E.G. 3列的数据和任意数量的行

我想要做的是对列的所有相同的第一个条目的每列的一些操作。

因此,对于上面的例子:脚本看起来和看到有3行,第一列是1 - 然后它对这3行做一些操作 - 可以说第三列和第二列。然后,它在阵列中存储这些值 - 因此目前这个阵列将具有值:

store_values = [5,63,20]

然后查找在第一列中的下一个相同的值:它看到有两个2.3。然后它执行相同的操作(以列3和2之间的差)和追加store_value阵列,所以现在:

store_values = [5,63,20,41,19]

然后,它再次搜索:看到两个3.1 - 做同样的事情,并继续这样做,直到它贯穿所有相同的值。 txt被排序 - 因为我认为这将更容易处理。

最终store_values = [5,63,20,41,19,41,29,8,64,36]

现在我使用了非常基本的例子与所述的差别,因为我知道我可以得到上面的数组只是考虑了差异而不是担心第一列 - 但是我的脚本正在做一些更复杂的事情,它必须依赖于第一列 - 例如将第3列和第2列绘制为相同的第一个条目,线性拟合,并将斜率存储在阵列中。

至今:

import numpy as np 

data_file_name = 'whatever.dat' 

data=np.loadtxt(data_file_name) 

希望这是有道理的 - 如果我需要澄清的东西,请评论

+0

我要提到我有25,000行的数据 - 所以内存是一个问题。 – Scientized

+0

你并没有真正的内存问题。 25,000行乘3列乘8个字节,每个浮点数为600kB。您的机器拥有1,000-10,000倍的内存。 – Dunes

回答

2

您可以同时使用uniquewhere从numpy的解决你的问题。下面的代码:

import numpy as np 

data_file_name = 'in.txt' 

data=np.loadtxt(data_file_name) 

unique = np.unique(data[:,0]) 
out = [] 
for i in unique: 
    ind = np.where(data[:,0]==i) 
    out.append(data[ind,2]-data[ind,1]) 
outarray = np.hstack(out)[0] 

print(outarray) 

,结果是:

[ 5. 63. 20. 41. 19. 41. 29. 8. 64. 36.] 

使用unique功能,您不需要有整理出来的元素。根据您可能具有的其他标准(例如使用列表使用的内存超过所需内存),还有其他几种解决此问题的方法,但如果您的数据不太过分,则此解决方案是清晰且功能强大的。

+0

是的我应该提到我有25,000行数据 - 所以内存是一个问题。我会尝试这种方法,看看需要多长时间 – Scientized

+1

@renegade内存支出是一回事,性能(速度)是另一回事。虽然可能,但通常来说,两者都很困难,因为速度更快,您需要更快速地访问内容,而将内容放入内存中。无论如何,25000行并不多,解决方案应该可以正常工作。 – armatita

0

我相信问题很简单,您可能会过度解决问题。我会根据我对你问的内容的理解来回答。

  1. 你可以在每行1一次读:currentline = next(data)
  2. 在空间分割:info = currentline.split()
  3. 操纵,但是你想

NB的价值观 - '信息' 变量存储该数据作为一个列表。在你的情况,对于线#1 info = ['1', '1', '6']

希望这会有所帮助!

2

您可以使用pandas来做到这一点,这比分组用numpy更通用。

  1. 阅读数据帧中的数据,

与read_table:

In [5]: df=read_table('so.txt',header=None,sep='\s+')  
""" 
    0 1 2 
0 1.0 1 6 
1 1.0 2 65 
2 1.0 3 23 
3 2.3 2 43 
4 2.3 4 23 
5 3.1 4 45 
6 3.1 6 35 
7 3.1 7 15 
8 5.0 3 67 
9 5.0 9 45 
""" 
  • 通过柱0组数据,
  • 和在数组中组织第1列和第2列。

    In [6]: groups=df.groupby(0)[[1,2]].apply(array) 
    """ 
    0 
    1.0  [[1, 6], [2, 65], [3, 23]] 
    2.3    [[2, 43], [4, 23]] 
    3.1 [[4, 45], [6, 35], [7, 15]] 
    5.0    [[3, 67], [9, 45]] 
    
    """ 
    
    1. 然后根据需要使用。

    绘制例如:

    In [7]: for label,points in groups.iteritems(): plot(*points.T,label=label);legend() 
    

    enter image description here