如何将形状为(7,100,50)的3D numpy数组转为含坐标与值的DataFrame?
解决方案
针对3D numpy数组转包含x/y/z坐标和像素值的DataFrame,有两种实现方式,兼顾你的原有代码逻辑和高效性:
方式一:沿用列表推导式(适配你原代码的坐标逻辑)
直接扩展原有代码,新增z维度的循环:
import numpy as np import pandas as pd # 3D数组 zimg = np.random.randint(0,30,size=(7,100,50)) z_num, y_size, x_size = zimg.shape # 展平所有像素值 cell_id = zimg.flatten() # 生成x坐标:每个图像的x索引(0-49)循环100次,共7张图 x = [i % x_size for i in range(len(cell_id))] # 生成y坐标:每个y值(0-49)重复100次,再重复7次(对应7张图) y = [y_val for y_val in range(x_size) for _ in range(y_size) for __ in range(z_num)] # 生成z坐标:每个z值(0-6)重复100*50次(单张图的总像素数) z = [z_val for z_val in range(z_num) for _ in range(y_size * x_size)] # 构建DataFrame df = pd.DataFrame(data={"id": cell_id, "x": x, "y": y, "z": z})
方式二:用numpy高效生成坐标(推荐,大数据量更快)
利用numpy的indices直接生成三维坐标矩阵,再展平,比列表推导式效率高得多:
import numpy as np import pandas as pd zimg = np.random.randint(0,30,size=(7,100,50)) # 生成三维坐标矩阵:z_coords对应第0维度,y_coords对应第1维度,x_coords对应第2维度 z_coords, y_coords, x_coords = np.indices(zimg.shape) # 展平所有数据 cell_id = zimg.flatten() z = z_coords.flatten() # 完全匹配你原代码逻辑的y/x生成 y = x_coords.flatten() x = np.tile(np.repeat(np.arange(x_coords.shape[2]), y_coords.shape[1]), z_coords.shape[0]) df = pd.DataFrame(data={"id": cell_id, "x": x, "y": y, "z": z})
注意点
你原代码中对y坐标的生成可能存在坐标顺序混淆:原img是(100,50)(行×列),但你的y是基于列数(50)循环行数(100)次,得到的y值是列索引而非行索引。如果你的实际需求是y对应图像的行(0-99),x对应列(0-49),则需要调整:
- 列表推导式中y改为:
y = [y_val for y_val in range(y_size) for _ in range(x_size) for __ in range(z_num)] - numpy方式中直接用:
y = y_coords.flatten(),x = x_coords.flatten()
内容的提问来源于stack exchange,提问作者zeratoss
相关产品推荐
相关产品推荐

