【问题标题】:Faster way of converting a dataframe of x,y,z values into an image?将 x,y,z 值的数据帧转换为图像的更快方法?
【发布时间】:2022-02-03 04:59:41
【问题描述】:

我有一个简单的数据框结构,如下所示:

print(scene_2d_df.head())

     x       y  z
0  963  1691.0  0
1  911  1881.0  0
2  837   864.0  1
3  785  1054.0  0
4  897    59.0  0

print(scene_2d_df.shape)

(2294591, 3)

每一行代表图像中的一个白点或黑点(1 或 0)。 xy 列是像素位置。图像约为。在这种情况下为 1200 x 1800。我有我认为有效的代码,但即使在现代机器上运行也非常缓慢。这种方法有点暴力。

def construct_image_from_df(df_1):
    xmax = int(df_1.max(axis=0)['x'])
    xmin = int(df_1.min(axis=0)['x'])
    ymax = int(df_1.max(axis=0)['y'])
    ymin = int(df_1.min(axis=0)['y'])
    zmax = int(df_1.max(axis=0)['z'])
    zmin = int(df_1.min(axis=0)['z'])
    
    print("xmin :: " + str(xmin) + " // xmax :: " + str(xmax)) # 1200-something
    print("ymin :: " + str(ymin) + " // ymax :: " + str(ymax)) # 1800-something
    print("zmin :: " + str(zmin) + " // zmax :: " + str(zmax)) # 1, all values 0 or 1
    
    img = np.zeros((xmax, ymax))
    
    length = df_1.shape[0] # number of rows
    for i in range(0, length):
        x, y, z = int(df_1.iloc[i]['x']), int(df_1.iloc[i]['y']), int(df_1.iloc[i]['z'])
        img[x - 1, y - 1] = z

    return img

基本上,我抓取数据帧的每一行,并手动将像素写入我的 2D img 数组。速度很慢。

有没有更快(可能是矢量化)的方法来做到这一点?

【问题讨论】:

标签: python pandas numpy


【解决方案1】:

您几乎可以直接在索引表达式中使用坐标。

首先,不要多次计算最小值和最大值:

x_max, y_max = df[['x', 'y']].max()
x_min, y_min = df[['x', 'y']].min()

然后,将z 值直接放入图像缓冲区:

img = np.zeros((x_max + 1, y_max + 1), dtype=df['z'].dtype)
img[df['x'].to_numpy(dtype=int), df['y'].to_numpy(dtype=int)] = df['z'].to_numpy()

更改数据类型是必要的,因为y 似乎包含具有整数值的浮点数。索引数组需要是整数。您还可以将 dtype 调整为保持znp.min_scalar_type 所需的最小值:

np.zeros((x_max + 1, y_max + 1), dtype=np.min_scalar_type(df['z'].max()))

如果您想要一个布尔掩码并且知道z 代表真/假值,请将img 的dtype 强制为bool

【讨论】:

  • 几乎可以运行,只是一个索引错误:` img[df['x'].to_numpy(dtype=int), df['y'].to_numpy(dtype=int)] = df['z'].to_numpy() IndexError: index 1215 is out of bounds for axis 0 with size 1215`
  • 我会改成np.zeros((x_max+1, y_max+1),以避免在索引img[x_max, y_max]时出现IndexError
  • @jfaccioni 是的,是的,这使得这段代码工作:) 我会确认一切都很好并很快接受这个答案
  • @JDS。固定的。谢谢你的收获
  • 是的,答案很好,能够显示图像并获得预期的结果。干杯:)
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 2021-10-22
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2021-06-17
相关资源
最近更新 更多