Python While循环具有特定的数组条件

Python While循环具有特定的数组条件,python,numpy,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 例如,3列数据和任意数量的行 我要做的是对每一列的所有相同的第一个条目进行一些操作 对于上面的示例:脚本查看并看到有3行,其中第一列为1——然后对这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
例如,3列数据和任意数量的行

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

对于上面的示例:脚本查看并看到有3行,其中第一列为1——然后对这3行执行一些操作——假设取第三列和第二列之间的差异。然后,它将这些值存储在一个数组中--因此现在这个数组将具有以下值:

存储_值=[5,63,20]

然后在第一列中搜索下一个相同的值:它看到有两个2.3。然后,它执行相同的操作(取第3列和第2列之间的差值)并附加store_值数组,因此现在:

存储_值=[5,63,20,41,19]

然后它再次搜索:查看两个3.1--执行上面相同的操作,并继续执行此操作,直到它遍历所有相同的值。txt是经过排序的——我认为这样更容易处理

最终存储_值=[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)

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

您可以使用numpy的
unique
where
来解决您的问题。代码如下:

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:
    currentline=next(data)
  • 在空格处拆分:
    info=currentline.split()
  • 根据需要操纵值
  • 注意,“info”变量将数据存储为列表。在您的情况下,对于第1行
    info=['1','1','6']

    希望这有帮助

    您可以使用它来进行分组,它在分组方面比numpy更通用

  • 读取数据帧中的数据
  • 使用read_表:

    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]]
    
    """
    
  • 你想怎么用就怎么用
  • 例如:

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

    是的,我应该提到我有25000行数据,所以内存是个问题。我会试试这个方法,看看能坚持多久takes@renegade内存消耗是一回事,性能(速度)是另一回事。虽然有可能,但一般来说,两者兼备是很困难的,因为要获得更高的速度,您需要通过将内容放入ram来更快地访问。在任何情况下,25000行并不多,解决方案应该可以很好地工作。我应该提到我有25000行数据——因此内存是一个问题。您实际上没有内存问题。25000行乘3列乘8字节,每个浮点值为600kB。您的机器的内存是所需内存的1000-10000倍。