如何筛选第一列≤20000的数据并生成含对应ID的二维numpy数组
嘿,这需求我熟!咱们用Python来实现的话步骤很清晰,我给你拆解成几个关键步骤,附带代码示例:
实现思路与代码示例
1. 读取文本文件中的数据
首先咱们得把文本里的数据读进来,提取出需要的ID和三维坐标x,y,z(因为要计算点之间的距离)。假设你的数据文件名叫data.txt,第一行是注释行(就是你示例里的# ID M1 M2 ...),代码可以这么写:
import math # 存储提取后的ID和坐标 data_list = [] with open('data.txt', 'r') as file: # 跳过第一行的注释 next(file) for line in file: # 分割每行数据,过滤掉多余的空格 row_data = list(filter(None, line.strip().split())) # 提取ID(第一个元素)和x,y,z(最后三个元素) point_id = int(row_data[0]) x = float(row_data[-3]) y = float(row_data[-2]) z = float(row_data[-1]) data_list.append( (point_id, x, y, z) )
2. 计算每个点到最后一个点的距离
接下来咱们用欧几里得距离公式计算所有点到最后一个点的距离,这是3D空间中点距离的常用计算方式:
# 获取最后一个点的坐标 last_point = data_list[-1] last_x, last_y, last_z = last_point[1], last_point[2], last_point[3] # 存储每个点的ID和对应的距离 id_distance_pairs = [] for point in data_list: pid, x, y, z = point # 计算欧几里得距离 distance = math.sqrt( (x - last_x)**2 + (y - last_y)**2 + (z - last_z)**2 ) id_distance_pairs.append( (pid, distance) )
如果你需要的是曼哈顿距离或者其他距离类型,直接替换这里的距离公式就行~
3. 筛选符合条件的点并生成二维数组
最后咱们筛选出距离≤20000的条目,生成你需要的两列二维数组(第一列是ID,第二列是对应的距离;要是你想把距离放第一列,调整顺序就行):
# 筛选距离≤20000的条目,生成二维数组 result_array = [ [pair[0], pair[1]] for pair in id_distance_pairs if pair[1] <= 20000 ] # 打印看看结果 print("符合条件的ID与距离:") for row in result_array: print(row)
大数据量优化:用Numpy加速
如果你的数据量很大,用Numpy来处理会快很多,代码示例如下:
import numpy as np # 读取数据,跳过第一行注释,只取ID和x,y,z列 data = np.loadtxt('data.txt', skiprows=1, usecols=(0, -3, -2, -1)) point_ids = data[:, 0].astype(int) coordinates = data[:, 1:] # 获取最后一个点的坐标 last_coord = coordinates[-1] # 批量计算所有点到最后一个点的距离 distances = np.sqrt(np.sum((coordinates - last_coord)**2, axis=1)) # 筛选距离≤20000的条目,生成二维数组 mask = distances <= 20000 result_array = np.column_stack( (point_ids[mask], distances[mask]) ).tolist() print(result_array)
内容的提问来源于stack exchange,提问作者bhjghjh
相关产品推荐
相关产品推荐

