最近写遗传算法作业要用老师给的数据进行测试,于是学习了一些方法……
提供的数据为城市间距离的下三角矩阵,直观显示大概为如下形式:
0
633 0
257 390 0
91 661 228 0
412 227 169 383 0
150 488 112 120 267 0
80 572 196 77 351 63 0
134 530 154 105 309 34 29 0
259 555 372 175 338 264 232 249 0
505 289 262 476 196 360 444 402 495 0
353 282 110 324 61 208 292 250 352 154 0
324 638 437 240 421 329 297 314 95 578 435 0
70 567 191 27 346 83 47 68 189 439 287 254 0
211 466 74 182 243 105 150 108 326 336 184 391 145 0
268 420 53 239 199 123 207 165 383 240 140 448 202 57 0
246 745 472 237 528 364 332 349 202 685 542 157 289 426 483 0
121 518 142 84 297 35 29 36 236 390 238 301 55 96 153 336 0
data = np.loadtxt('数据.txt', dtype=np.int, delimiter=' ')
这个方法就需要txt文件格式较为规范。
def file2array(path, delimiter=' '): # delimiter是数据分隔符
fp = open(path, 'r', encoding='utf-8')
string = fp.read() # string是一行字符串,该字符串包含文件所有内容
fp.close()
row_list = string.splitlines() # splitlines默认参数是‘\n’
data_list = [[float(i) for i in row.strip().split(delimiter)] for row in row_list]
# print(data_list)
# return np.array(data_list)
data = list(itertools.chain.from_iterable(data_list)) #二维数组转一维
return data
为了方便使用把空的部分填上。
distance = np.zeros([cityNum,cityNum])
# 遍历data[],填入distance[][]
for i in range(cityNum):
for j in range(cityNum):
# print(i, j, data[p])
distance[i][j] = data[p]
distance[j][i] = data[p]
p += 1
#每行读到"0"跳出列循环,到下一行
if data[p-1] == 0:
break
np.savetxt("test.txt", distance, fmt="%d", delimiter=" ") #distance-要输出的矩阵
效果如下:
说实话也不知道为什么要折腾那么几下 = = 总之就是虽然都是基本操作但本人很怕麻烦……
numpy.loadtxt() 用法
numpy基础教程–将二维数组转换为一维数组
python读入txt数据,并转成矩阵