Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 2.7-使用新的';订单';约束 我知道一些C++基础知识,但我是Python初学者。_Python_List_Csv_Tetgen - Fatal编程技术网

python 2.7-使用新的';订单';约束 我知道一些C++基础知识,但我是Python初学者。

python 2.7-使用新的';订单';约束 我知道一些C++基础知识,但我是Python初学者。,python,list,csv,tetgen,Python,List,Csv,Tetgen,我有一段工作代码(见下文),我想添加一个约束来格式化它的输出,但我不知道如何做 首先让我解释一下该程序的功能: import tetgen, geometry from pprint import pprint import random, csv import numpy as np from pprint import pprint all_colors = [(name, float(X), float(Y), float(Z)) for name, X, Y

我有一段工作代码(见下文),我想添加一个约束来格式化它的输出,但我不知道如何做

首先让我解释一下该程序的功能:

import tetgen, geometry
from pprint import pprint
import random, csv
import numpy as np
from pprint import pprint

all_colors = [(name, float(X), float(Y), float(Z))
              for name, X, Y, Z in csv.reader(open('colors.csv'))]

priority_list = {name: int(i)
                 for i, name in csv.reader(open('priority.csv'))}

# background is marked SUPPORT
support_i = [i for i, color in enumerate(all_colors) if color[0] == 'SUPPORT']
if len(support_i)>0:
    support = np.array(all_colors[support_i[0]][1:])
    del all_colors[support_i[0]]
else:
    support = None

tg, hull_i = geometry.tetgen_of_hull([(X,Y,Z) for name, X, Y, Z in all_colors])
colors = [all_colors[i] for i in hull_i]

print ("thrown out: "
       + ", ".join(set(zip(*all_colors)[0]).difference(zip(*colors)[0])))

targets = [(name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

for target in targets:
    name, X, Y, Z, BG = target
    target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)
    tet_i, bcoords = geometry.containing_tet(tg, target_point)

    output = open('output.txt','a')

    if tet_i == None:
        output.write(str(target[0]))
        output.write('\n')


    else:
        names = [colors[i][0] for i in tg.tets[tet_i]]
        sorted_indices = sorted(enumerate(names), key=lambda (i, name): priority_list[name])
        output.write(target[0])
        counting = 0

        for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
            output.write(',%s,%s' % (name, bcoords[i]))
            counting = counting + 1

            if counting > 3:
                output.write('\n')
                counting = 0

output.close()
我有一个输入文件
colors.csv
,其中包含一个颜色列表,一行一种颜色:颜色由其名称和色度坐标X、Y和Z定义,看起来是这样的:

Colorname, X1, Y1, Z1
Colorname2, X2, Y2, Z2
...etc.
给定包含在另一个输入文件
targets.csv
中的任何XYZ坐标列表,程序将在输出文件
output.txt

这个解决方案是通过首先用tetgen对点云进行三角剖分,然后在四面体中对点进行重心坐标计算得出的(但这里解释一切并不重要…)

解决方案的形式如下:

target, name0, density0, name1, density1, name2, density2, name3, density3
始终只有4个名称和相关密度

例如,它将如下所示:

122 ,PINKwA,0.202566115168,GB,0.718785775317,PINK,0.0647284446787,TUwA,0.0139196648363

123 ,PINKwA,0.200786239192,GB,0.723766147717,PINK,0.0673550497794,TUwA,0.00809256331169

124 ,PINKwA,0.19900636349,GB,0.72874651935,PINK,0.0699816544755,TUwA,0.00226546268446

125 ,OR0A,0.00155317194109,PINK,0.0716160265958,PINKwA,0.195962072115,GB,0.730868729348

126 ,OR0A,0.00409427478508,PINK,0.0726192660009,PINKwA,0.192113520109,GB,0.731172939105

127 ,OR0A,0.00663537762906,PINK,0.073622505406,PINKwA,0.188264968103,GB,0.731477148862
我现在想做什么?

出于实际原因,我希望我的输出遵循一定的顺序。 我想要一个“优先级列表”来规定
名称、密度
输出的顺序

我的实际程序以我不理解的顺序输出颜色名称,但无论如何,我需要这些颜色名称以特定的顺序,例如
PINK
应该始终是第一个
PINKwA
第二个,等等

而不是:

127 ,OR0A,0.00663537762906,PINK,0.073622505406,PINKwA,0.188264968103,GB,0.731477148862
我想要

127 ,PINK,0.073622505406,PINKwA,0.188264968103,OR0A,0.00663537762906,GB,0.731477148862
因为我的优先权清单上写着:

0, PINK
1, PINKwA
2, OR0A
3, GB
我如何简单地将此函数添加到下面的代码中?有什么想法吗

编辑的代码(工作…):

import tetgen, geometry
from pprint import pprint
import random, csv
import numpy as np
from pprint import pprint

all_colors = [(name, float(X), float(Y), float(Z))
              for name, X, Y, Z in csv.reader(open('colors.csv'))]

priority_list = {name: int(i)
                 for i, name in csv.reader(open('priority.csv'))}

# background is marked SUPPORT
support_i = [i for i, color in enumerate(all_colors) if color[0] == 'SUPPORT']
if len(support_i)>0:
    support = np.array(all_colors[support_i[0]][1:])
    del all_colors[support_i[0]]
else:
    support = None

tg, hull_i = geometry.tetgen_of_hull([(X,Y,Z) for name, X, Y, Z in all_colors])
colors = [all_colors[i] for i in hull_i]

print ("thrown out: "
       + ", ".join(set(zip(*all_colors)[0]).difference(zip(*colors)[0])))

targets = [(name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

for target in targets:
    name, X, Y, Z, BG = target
    target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)
    tet_i, bcoords = geometry.containing_tet(tg, target_point)

    output = open('output.txt','a')

    if tet_i == None:
        output.write(str(target[0]))
        output.write('\n')


    else:
        names = [colors[i][0] for i in tg.tets[tet_i]]
        sorted_indices = sorted(enumerate(names), key=lambda (i, name): priority_list[name])
        output.write(target[0])
        counting = 0

        for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
            output.write(',%s,%s' % (name, bcoords[i]))
            counting = counting + 1

            if counting > 3:
                output.write('\n')
                counting = 0

output.close()

首先,您需要在Python代码中直接编码优先级列表:

priority_list = {
    'PINK': 0,
    'PINKwA': 1,
    'OR0A': 2,
    'GB': 3,
}
这将允许您快速检索给定颜色名称的顺序。然后,您可以使用
参数对
排序
按优先级对姓名进行排序。但关键的是,您需要检索的不是已排序的名称,而是已排序名称的索引,就像

enumerate
builtin使用原始名称列表中的索引对每个名称进行注释,然后
sorted
builtin根据结果的
(i,name)
对在优先级列表中的排名进行排序。然后我们可以将名称写入文件,然后是
bcoords
数组中相应的元素(使用索引值)

for i, name in sorted_indices:
    output.write(',%s,%s' % (name, bcoords[i]))
因此,我将使代码中的最后一个块看起来像:

names = [colors[i][0] for i in tg.tets[tet_i]]
output.write(target[0])
for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
    output.write(',%s,%s' % (name, bcoords[i]))
output.write('\r\n')
output.close()

在这里,我将您的文件输出策略更改为更具python风格的—一般来说,将字符串添加到一起基本上是不可行的,最好是创建一个格式字符串并填充变量(您也可以在字符串上使用
.format()
)。此外,您可以多次调用
.write()
,它们只需继续向文件写入字节,因此无需一次创建一个大的长字符串即可写入。最后,无需在
'\r\n'
上调用
str
,因为它已经是一个字符串。

首先,您需要在Python代码中直接编码优先级列表:

priority_list = {
    'PINK': 0,
    'PINKwA': 1,
    'OR0A': 2,
    'GB': 3,
}
这将允许您快速检索给定颜色名称的顺序。然后,您可以使用
参数对
排序
按优先级对姓名进行排序。但关键的是,您需要检索的不是已排序的名称,而是已排序名称的索引,就像

enumerate
builtin使用原始名称列表中的索引对每个名称进行注释,然后
sorted
builtin根据结果的
(i,name)
对在优先级列表中的排名进行排序。然后我们可以将名称写入文件,然后是
bcoords
数组中相应的元素(使用索引值)

for i, name in sorted_indices:
    output.write(',%s,%s' % (name, bcoords[i]))
因此,我将使代码中的最后一个块看起来像:

names = [colors[i][0] for i in tg.tets[tet_i]]
output.write(target[0])
for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
    output.write(',%s,%s' % (name, bcoords[i]))
output.write('\r\n')
output.close()

在这里,我将您的文件输出策略更改为更具python风格的—一般来说,将字符串添加到一起基本上是不可行的,最好是创建一个格式字符串并填充变量(您也可以在字符串上使用
.format()
)。此外,您可以多次调用
.write()
,它们只需继续向文件写入字节,因此无需一次创建一个大的长字符串即可写入。最后,无需在
'\r\n'
上调用
str
,因为它已经是一个字符串。

谢谢,太好了!要使用.csv文件作为我的
优先级列表
我可以使用:
优先级列表=csv.reader(打开('priority.csv'))
??我应该在哪里插入这一行?这取决于.csv文件的结构。如果它的形式与上面列出的相同,那么我会使用
priority\u list={name:int(I)for I,name in csv.reader(open('priority.csv'))}
。嗨,我有点问题:我更新了代码,但我应该出错。我编辑了上面的代码,并在末尾添加了消息error:
TypeError:()正好接受2个参数(给定1个)
Ah,这是我的错误——排序键中需要括号。我会修改代码的。是的,看起来你没有完全整合代码。尝试从编辑的代码中删除最后8行。然后添加一行
else:
缩进4个空格。然后添加我建议的代码,缩进8个空格(即在else块内)。谢谢,太好了!要使用.csv文件作为我的
优先级列表
我可以使用:
优先级列表=csv.reader(打开('priority.csv'))
??我应该在哪里插入这一行?这取决于.csv文件的结构。如果它的形式与上面列出的相同,那么我会使用
priority\u list={name:int(I)for I,name in csv.reader(open('priority.csv'))}
。嗨,我有点问题:我更新了代码,但我应该出错。我编辑了上面的代码并添加了