根据特定条件替换值

时间:2014-03-07 17:47:26

标签: python numpy

我正在尝试进行文件操作和重新分配,其中文件有4列,如:

该文件有2514行和4列,格式为:

1 -0.000000 0.000000 0    
2 -0.000000 0.000000 0    
3 -7.009116 58.185083 1    
4 -7.009116 58.185670 1    
5 -7.009799 58.185410 0    
6 -7.009996 58.184643 1    
7 -7.009997 58.186257 1    
8 -7.012637 58.182443 1    
9 -7.013223 58.182150 1    
10 -7.010877 58.184203 1

我的目标是将文件加载到Python中,并根据我将设置为条件的x,y设置值,将标志值更改为我想要的数字

表示从x=-7.00y=58.1的{​​{1}}和变量y,然后将第4列更改为2(或3或4)

我想到了一些东西,但我不知道如何表达我提到的标准,然后用相同的格式编写一个新文件,但新标志。

63.5

3 个答案:

答案 0 :(得分:1)

您可以使用NumPy花式索引来避免for循环并获得更好的性能以应用条件(EDIT2:我将x==-7.00替换为基于容差的标准):

TOL = 0.001
crit1 = (abs((abs(x)-7.00))<TOL) & (y>=58.1) & (y<63.5)
flag[crit1] = 2

...

应用所有条件后,您可以直接打印data xyzflag实际上是原始2-D的视图数组data

np.savetxt('output_file_name', data)

编辑:完整代码的示例:

from numpy import *

a='' #x-coordinates
b='' #y-coordinates

data = loadtxt("battri.node") 

nodes=data[:,0]

x=data[:,1]
y=data[:,2]  
flag=data[:,3]

crit1 = (x==-7.00) & (y>=58.1) & (y<63.5)
flag[crit1] = 2

savetxt('output_file_name', data)

答案 1 :(得分:0)

您似乎不仅想要定义一组标准,还要定义行动/规则来对其采取行动。因此,我将它们定义为Python函数形式的一系列变换。

Python有first-class functions,因此您可以将函数作为参数传递给其他函数:

这样的事情:

data = [(1, 2.5, 1.0, 99),
        (2, 7.0, 2.5, 99),
        (3, 1.0, 2.5, 99)]


def transform1(nodes, x, y, flag):
    if x == 7.0 and 0.0 < y < 5.0:
        flag = 77
    return nodes, x, y, flag


def transform2(nodes, x, y, flag):
    if x == 1.0:
        flag = 42
    return nodes, x, y, flag


# Will be applied in order
transforms = [transform1, transform2]


result = []
for row in data:
    for transform in transforms:
        transformed = transform(*row)
    result.append(transformed)

print result

输出:

[(1, 2.5, 1.0, 99),
 (2, 7.0, 2.5, 99),
 (3, 1.0, 2.5, 42)]

答案 2 :(得分:0)

这里似乎有几个问题。让我们从阅读数据开始:

Python的file类有一个名为readlines()的有用函数,它将返回一个包含文件中每一行的列表。 IE:

lines = []
with open('filename.txt') as file:
     lines = file.readlines()

然后,您可以迭代此列表并将其转换为值元组,然后转换值:

transformed_data = []
for line in lines:
    node, x, y, flag = line.split()
    # Do transform on values here
    transformed_data.append(' '.join([node, x, y, flag])

最后,您可以直接将数据写入文件:

with open('out_file.txt', 'w') as out_file:
     file.write(transformed_data)

如果第一行是标题,则必须考虑到这一点,但这样做非常简单。查看documentation有关如何阅读/写入文件的更多信息。