[英]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.