while循环具有某些数组条件

时间:2016-04-03 12:30:46

标签: python numpy

需要一些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)

希望这是有道理的 - 如果我需要澄清一些事情,请发表评论

3 个答案:

答案 0 :(得分:2)

您可以使用numpy中的uniquewhere来解决您的问题。这是代码:

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功能,您不需要整理元素。根据您可能具有的其他标准,还有其他几种方法可以解决此问题(例如,使用列表使用的内存比需要的多),但如果您的数据不是太多,则此解决方案清晰且有效。

答案 1 :(得分:2)

您可以使用pandas来执行此操作,这比分组的numpy更通用。

  1. 阅读DataFrame中的数据
  2. 使用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
    """
    
    1. 按第0列分组数据
    2. 并在数组中组织第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. 随意使用。
      2. 绘图例如:

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

        enter image description here

答案 2 :(得分:0)

我认为问题很简单,你可能会过度思考解决方案。我会根据我对你问的理解来回答。

  1. 您可以一次阅读每一行:currentline = next(data)
  2. 在空格处分开:info = currentline.split()
  3. 操纵您想要的值
  4. NB - ' info'变量将数据存储为列表。在您的情况下,对于第1行info = ['1', '1', '6']

    希望这有帮助!