【问题标题】:Sorting data for plotting in mplot3d排序数据以在 mplot3d 中绘图
【发布时间】:2010-11-18 21:23:19
【问题描述】:

我一直在使用 mplot3d(matplotlib 的一部分)进行各种 3d 绘图,它的工作表现令人钦佩。但是,我遇到了一个新问题。

Mplot3d 期望数据以某种方式排序,以绘制线框。例如,它喜欢这样的东西:

x = array([[1, 2, 3],
          [1, 2, 3],
          [1, 2, 3]])

y = array([[1, 1, 1],
          [2, 2, 2],
          [3, 3, 3])

其中 z 是一个相同维度的数组,其数据对应于空间中的每个位置。

很遗憾,我的数据不是这样格式化的 - 每隔一行都颠倒过来,因为数据是通过以光栅模式扫描来收集的。

所以我有类似的东西:

x = array([[1, 2, 3],
          [3, 2, 1],
          [1, 2, 3]])

我目前的方法是一种非常丑陋的蛮力“做一个 for 循环然后检查你是否在奇数行中”,它从旧数组中构建了一个新数组,但我希望有一个更优雅的方式来做到这一点。棘手的部分是我必须以与 X 和 Y 相同的方式重新排列 Z 数组,以确保保留与每个点对应的数据是空间。

理想情况下,我想要一些功能强大且专门设计用于对一组包含任意随机位置点的二维数组进行排序的东西,但即使是一种更 Python 的方式来做我已经在做的事情,我也将不胜感激。如果我可以让它更健壮,并且不依赖于这种特定的光栅扫描模式,从长远来看,它可能会让我头疼。

【问题讨论】:

    标签: python sorting numpy matplotlib


    【解决方案1】:

    如果我理解正确,您只想这样做:x[1::2, :] = x[1::2, ::-1]

    有一些问题...如果您不制作 x 的中间副本,由于广播在 numpy 中的工作方式,它并不能完全达到您的预期。

    尽管如此,使用基本索引仍然很简单:

    import numpy as np
    x = np.array([[1,2,3],[3,2,1],[1,2,3],[3,2,1],[1,2,3]])
    x_rev = x.copy()
    x_rev[1::2, :] = x[1::2, ::-1]
    

    这会转换这个 (x):

    array([[1, 2, 3],
           [3, 2, 1],
           [1, 2, 3],
           [3, 2, 1],
           [1, 2, 3]])
    

    进入这个(x_rev):

    array([[1, 2, 3],
           [1, 2, 3],
           [1, 2, 3],
           [1, 2, 3],
           [1, 2, 3]])
    

    如果您不熟悉 python 中的切片,x[1::2] 将选择 x 的所有其他项,从第二项开始。 (1 是起始索引,2 是增量)相比之下,x[::-1] 只是指定了-1 的增量,从而反转了数组。在这种情况下,我们仅将这些切片应用于特定轴,因此我们可以从第二行开始每隔一行选择和反转。

    【讨论】:

    • 我有一些切片经验,但没有想到那种确切的方法,尽管现在回想起来似乎很明显 - 谢谢!我仍在尝试寻找一种聪明的方法来进行排序,即使我的数据排列发生变化也能正常工作,但这远不是优先事项。
    • @user512679 - 好吧,如果你只想对每一行进行排序,你可以这样做np.sort(x, axis=1)
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多