数据处理
import numpy as np
import operator
import os
import copy
from matplotlib.font_manager import FontProperties
from scipy.interpolate import lagrange
import random
import matplotlib.pyplot as plt
import math
np.set_printoptions(suppress=True)
# 把opt文件内的逗号变为空格
#数据在我的百度云数据库txt文件,及opt文件
np.set_printoptions(threshold=np.inf) #输出全部矩阵不带省略号
random.seed(100)
##########################################
data = np.loadtxt('../txt/Vit_3Day.txt')
print(len(data))
# data = data[0:13000]#抽取一部分 # 300十类,2735 1000分类,点数270
x1 = data[:,5]#x起点坐标
x2 = data[:,9]#x终点坐标
y1 = data[:,6]#y起
y2 = data[:,10]#y起
z1 = data[:,4]#IDpart
z2 = data[:,8]#IDpart
diam = data[:,12]
s1 = [a1 for a1 in range(1,len(x1)-1) if z1[a1]==z2[a1-1]!=-1 or z1[a1]!= z2[a1-1]]#id相同不等于0,或id不同
# print(s1)
lx = []#x1,x2相同的部分组成的列表
lxqi = []
lxzg = []
for i1 in range(len(s1)-1):
b1 = x1[s1[i1]:s1[i1+1]]
b1 = b1.tolist()
b2 = x2[s1[i1+1]-1]#s1[i1]相当于a1
# b1 = b1 + [b2]#把与x2最后相连的一个数和x1拼接起来
b5 = z1[s1[i1]]#x,y起点id
b1qi_id = [b5]+b1 +[b2]
b6 = z2[s1[i1+1]-1]#x,y终点id
b1zg_id = [b6] + b1+[b2]
lx.append(b1)
lxqi.append(b1qi_id)
lxzg.append(b1zg_id)
###################################################
ly = []#y坐标以及管径大小
for i3 in range(len(s1)-1):
b3 = y1[s1[i3]:s1[i3+1]]
b3 = b3.tolist()
b4 = y2[s1[i3+1]-1]#y最后一个不相等的数
b3 = b3 + [b4]
dm = diam[s1[i3+1]-1]
b3 = b3 + [dm]#加上管径
ly.append(b3)
#####################################################
#带有起点id的x坐标与y坐标合并
for q1 in range(len(lxqi)):
for q2 in range(len(ly[q1])):
lxqi[q1].append(ly[q1][q2])
#带有终点id的x坐标与y坐标合并
for p1 in range(len(lxzg)):
for p2 in range(len(ly[p1])):
lxzg[p1].append(ly[p1][p2])
lxqi.sort(key=operator.itemgetter(0))#排序,只按照第一个索引大小排序
tou = lxqi
lxzg.sort(key=operator.itemgetter(0))
wei = lxzg
# #########################################
toudeng = []
weideng = []
for dwei in wei:
for i in range(len(tou)-1):
if dwei[0] ==tou[i][0] and dwei[0]==tou[i+1][0]:
toud = [dwei,tou[i],tou[i+1]]
toudeng.append(toud)
for dtou in tou:
for i in range(len(wei)-1):
if dtou[0] == wei[i][0] and dtou[0]==wei[i+1][0]:
weid = [wei[i],wei[i+1],dtou]
weideng.append(weid)
# ###################################################
datatoudeng = []
dataweideng = []
#去掉起点id
for i in range(len(toudeng)):
a = toudeng[i][0][1::]
b = toudeng[i][1][1::]
c = toudeng[i][2][1::]
d = [a]+[b]+[c]
datatoudeng.append(d)
for i in range(len(weideng)):
a1 = weideng[i][0][1::]
b1 = weideng[i][1][1::]
c1 = weideng[i][2][1::]
d1 = [a1]+[b1]+[c1]
dataweideng.append(d1)
####################################################################
#判断管径信息是否加进列表,若未加进则只为x,y坐标,为偶数
for i in range(len(dataweideng)):
a = dataweideng[i]
assert len(a[0])%2==1
assert len(a[1])%2==1
assert len(a[2])%2==1
for i in range(len(datatoudeng)):
a = datatoudeng[i]
assert len(a[0])%2==1
assert len(a[1])%2==1
assert len(a[2])%2==1
final_tou = datatoudeng
##############################################################################
#将尾等分叉排列方式改为,与头等分叉相同的排列方式
final_wei = []
for i in range(len(dataweideng)):
zhu = dataweideng[i][0]
zuo = dataweideng[i][1]
you = dataweideng[i][2]
zhu_diam = [zhu[-1]]
zuo_diam = [zuo[-1]]
you_diam = [you[-1]]
zhu_diam1 = [zhu[-1]]
zuo_diam1 = [zuo[-1]]
you_diam1 = [you[-1]]
zhu_x = zhu[0:len(zhu)//2]
zuo_x = zuo[0:len(zuo)//2]
you_x = you[0:len(you)//2]
zhu_y = zhu[len(zhu)//2:(len(zhu)-1)]
zuo_y = zuo[len(zuo)//2:(len(zuo)-1)]
you_y = you[len(you)//2:(len(you)-1)]
#反转它们的顺序
zhu_x1 = zhu_x[::-1]
zuo_x1 = zuo_x[::-1]
you_x1 = you_x[::-1]
zhu_y1 = zhu_y[::-1]
zuo_y1 = zuo_y[::-1]
you_y1 = you_y[::-1]
zhu_x = you_x1
zuo_x = zhu_x1
you_x = zuo_x1
zhu_y = you_y1
zuo_y = zhu_y1
you_y = zuo_y1
zhu_diam = you_diam1
zuo_diam = zhu_diam1
you_diam = zuo_diam1
zhu_xy = zhu_x + zhu_y
zuo_xy = zuo_x + zuo_y
you_xy = you_x + you_y
#这里再将坐标点与管径接起来
zhu = zhu_xy + zhu_diam
zuo = zuo_xy + zuo_diam
you = you_xy + you_diam
fencha = [zhu] + [zuo] + [you]
final_wei.append(fencha)
# 这里是将分叉和汇聚都加在了一起
# final = final_tou + final_wei
# 若想把分叉和汇聚分开,则单独提取即可
final = final_tou
############################################################################
# 将所有的分叉主分支反转
final_zhu_reversed = []
for i in range(len(final)):
zhu = final[i][0]
zuo = final[i][1]
you = final[i][2]
zhu_diam = [zhu[-1]]
zuo_diam = [zuo[-1]]
you_diam = [you[-1]]
zhu_x = zhu[0:len(zhu)//2]
zuo_x = zuo[0:len(zuo)//2]
you_x = you[0:len(you)//2]
zhu_y = zhu[len(zhu)//2:(len(zhu)-1)]
zuo_y = zuo[len(zuo)//2:(len(zuo)-1)]
you_y = you[len(you)//2:(len(you)-1)]
#反转它们的顺序
zhu_x1 = zhu_x[::-1]
zhu_y1 = zhu_y[::-1]
zhu_x = zhu_x1
zhu_y = zhu_y1
zhu_xy = zhu_x + zhu_y
zuo_xy = zuo_x + zuo_y
you_xy = you_x + you_y
#这里再将坐标点与管径接起来
zhu = zhu_xy + zhu_diam
zuo = zuo_xy + zuo_diam
you = you_xy + you_diam
fencha = [zhu] + [zuo] + [you]
final_zhu_reversed.append(fencha)
final = final_zhu_reversed
############################################################################
# 可视化数据
# data = final
# for i in range(len(data)):
# zhu = data[i][0]
# zuo = data[i][1]
# you = data[i][2]
# print(zhu)
# print(zuo)
# print(you)
# zhu_diam = [zhu[-1]]
# zuo_diam = [zuo[-1]]
# you_diam = [you[-1]]
# zhu_x = zhu[0:len(zhu)//2]
# zuo_x = zuo[0:len(zuo)//2]
# you_x = you[0:len(you)//2]
# zhu_y = zhu[len(zhu)//2:(len(zhu)-1)]
# zuo_y = zuo[len(zuo)//2:(len(zuo)-1)]
# you_y = you[len(you)//2:(len(you)-1)]
# # print(zhu_x)
# # print(zuo_x)
# # print(you_x)
# print("下一个")
##############################################################################
#去除重复的点(包括头部相等和尾部相等)
final1 = []
for i in range(len(final)):
zhu = final[i][0]
zuo = final[i][1]
you = final[i][2]
zhu_diam = [zhu[-1]]
zuo_diam = [zuo[-1]]
you_diam = [you[-1]]
zhu_x = zhu[0:len(zhu)//2]
zuo_x = zuo[0:len(zuo)//2]
you_x = you[0:len(you)//2]
zhu_y = zhu[len(zhu)//2:(len(zhu)-1)]
zuo_y = zuo[len(zuo)//2:(len(zuo)-1)]
you_y = you[len(you)//2:(len(you)-1)]
###########################################
#前后不相等加进数组,最后再接上原始数组的最后一个
zhu_x1 = []
zhu_y1 = []
for j in range(len(zhu_x)-1):
if zhu_x[j] != zhu_x[j+1] or zhu_y[j] != zhu_y[j+1]:
zhu_x1.append(zhu_x[j])
zhu_y1.append(zhu_y[j])
zhu_x1.append(zhu_x[-1])
zhu_y1.append(zhu_y[-1])
zuo_x1 = []
zuo_y1 = []
for j in range(len(zuo_x)-1):
if zuo_x[j] != zuo_x[j+1] or zuo_y[j] != zuo_y[j+1]:
zuo_x1.append(zuo_x[j])
zuo_y1.append(zuo_y[j])
zuo_x1.append(zuo_x[-1])
zuo_y1.append(zuo_y[-1])
you_x1 = []
you_y1 = []
for j in range(len(you_x)-1):
if you_x[j] != you_x[j+1] or you_y[j] != you_y[j+1]:
you_x1.append(you_x[j])
you_y1.append(you_y[j])
you_x1.append(you_x[-1])
you_y1.append(you_y[-1])
###########################################
zhu_xy = zhu_x1 + zhu_y1
zuo_xy = zuo_x1 + zuo_y1
you_xy = you_x1 + you_y1
#这里再将坐标点与管径接起来
zhu = zhu_xy + zhu_diam
zuo = zuo_xy + zuo_diam
you = you_xy + you_diam
fencha = [zhu] + [zuo] + [you]
final1.append(fencha)
final = final1
############################################################################
#可视化数据,观察哪些数据
# for i in range(len(final)):
# print("第%d个分叉" %i)
# for j in range(len(final[i])):
# print(final[i][j])
# print("**********************")
##############################################################################
#观察每一个分支有多少个坐标点,算上管径最多59,最少为7
axis_num_list = []
extract = []
for i in range(len(final)):
for j in range(len(final[i])):
axis_num = len(final[i][j])
axis_num_list.append(axis_num)
for file in axis_num_list:
if file < 33 :
extract.append(file)
print(len(axis_num_list))
print(len(extract))
print(max(axis_num_list))
##################################################################################
# # 挑选出每个分支小于20个数的分叉
# select_final = []
# for i in range(len(final)):
# point_num = 11
# if len(final[])
# print("下一个")
######################################################################################
# 挑选出每个分支小于33个数的分叉,x,y坐标个数分别为16,管径为1,这些点一个2830个,小于等于33的有2738个
select_final = []
for i in range(len(final)):
point_num = 33
if len(final[i][0])
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?