簡體   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