繁体   English   中英

在mplot3d中绘制数据以进行绘图

[英]Sorting data for plotting in mplot3d

我一直在使用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数组,以确保保留与每个点对应的数据的空间。

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

如果我理解正确,你只想这样做: 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的增量,从而反转数组。 在这种情况下,我们只将这些切片应用于特定轴,因此我们可以从第二行开始选择并反转每隔一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM