如何优雅地归一化二维坐标数组(将最小x、y值调整为0)
如何优雅地归一化二维坐标数组(将最小x、y值调整为0)
嘿,你的思路完全没问题,但用NumPy的向量化操作能把这一堆繁琐的步骤压缩成几行甚至一行,既简洁又高效!
你原来的代码手动提取x/y值、循环赋值的方式虽然能实现功能,但NumPy本身就支持对整个数组的批量操作,完全不用写循环。直接看优化后的代码:
import numpy as np # 给定的坐标数组 pa = np.array([[ 213.00002 , 213.00002 ],[ -213.00002 , 213.00002 ],[ 213.00002 , -213.00002 ],[ -213.00002 , -213.00002 ]]) # 核心步骤:计算每列的最小值,然后数组整体减去这个最小值数组 p1 = pa - pa.min(axis=0) # 如果你需要指定float32类型,加上这一行 p1 = p1.astype(np.float32) # 输出结果和你手动计算的一致(浮点精度差异可忽略) print(p1) # [[426.00003 426.00003] # [ 0. 426.00003] # [426.00003 0. ] # [ 0. 0. ]]
给你拆解下为什么这行代码能搞定:
pa.min(axis=0):沿着列方向(也就是x、y各自的维度)计算最小值,得到的是[x_min, y_min],正好对应你手动提取的pa_min_x和pa_min_y。- NumPy的广播机制会自动把这个长度为2的最小值数组扩展成和原数组一样的形状,然后逐元素相减——相当于每个坐标点的x值减去x_min,y值减去y_min,完美实现了你要的“把最小x、y拉到0”的效果。
这种方法不仅代码量少,而且效率比循环高得多,尤其是当你的坐标数组很大的时候,优势会特别明显。
备注:内容来源于stack exchange,提问作者Paul St George
相关产品推荐
相关产品推荐

