2014-08-29 134 views
0

小故事是:我試圖通過使用邏輯零或任何其他方式刪除數組中的精確點。numpy刪除數組值(邏輯零)

我從定義翼的一些點的座標開始。與他們在一起,我試圖形成一個沒有交叉線的好多邊形。這是通過從第一點開始(任意一點),然後填充下一點作爲離第一點最近的點。

座標加載爲xEdge和yEdge。我做的第一件事就是創建一個只有0的副本,如下所示。 xEdgeOrdered和yEdgeOrdered將被填充多邊形點。我還將創建一個僅用於檢查多邊形已採用哪些值的類型。

xEdgeOrdered = np.zeros_like(xEdge) 
yEdgeOrdered = np.zeros_like(xEdge) 
notUsed = np.ones_like(xEdge) 

然後,我們開始我們的多邊形與y最大例如,這裏開始的問題。

startIndex = np.argmax(yEdge) 
xEdgeOrdered[0] = xEdge[startIndex] 
notUsed[startIndex] = 0 

在最後一行,當我狀態NOTUSED [的startIndex] = 0,我真正想要做的是取代「拿來主義」的值作爲邏輯0 - MATLAB中的「假」。目標是這個值不再可用,基本上從數組中刪除。

我試圖掩蓋它(見下文),但我發現它不能在腳本的下一步完美工作。

notUsed = np.ma.masked_where(notUsed == 0, notUsed) 

下一步是找到下一個最近點的循環。我將首先嚐試描述我正在嘗試在單詞中做什麼,然後我將附加我的代碼(該代碼尚未運行...)。

從初始點1開始,我需要使用向量長度來找到下一個最近的點。我會嘗試所有剩餘的點。要知道剩餘的點是什麼,我給我的函數的參數「notUsed」,記住是一個數組,如果不使用該點,則爲「1」,如果使用該數組,則爲0(由0表示「false」 「但我們還沒有找到如何)。 我所做的是讓xEdge的翻版作爲xEdgewhile,設置我們只是用來值爲0,然後請其值= 0,應該屏蔽

一旦最小值被發現,索引位置被記錄。使用它,我們可以在xEdgeOrderedn中填充這個新點並繼續從這個新點開始的循環。但是,在此之前,我們需要刪除剛剛使用的索引,以便它不再可用。如果我們在matlab中,我們不會使用(index)= false; - 問題是如何在Python中執行此操作?

這是我想出了代碼:

i, z, min = 1, 0, 'inf' 
xEdgewhile = xEdge + []; yEdgewhile = yEdge + []; 
while i < len(xEdge): 
     i = i + 1 
     notUsedIndices = indexVector #This line might be useless 
     while z < len(xEdge): 
     distance = math.sqrt((xEdgewhile[z] - xEdgeOrdered[(i-1)])**2 + (yEdgewhile[z] - yEdgeOrdered[(i - 1)])**2) 
     if distance < min: 
      min, distance_min, = distance, z 
     z = z + 1 
     print min 
     xEdgeOrdered[i] = xEdge[distance_min] 
     yEdgeOrdered[i] = yEdge[distance_min] 
     xEdgewhile[distance_max], yEdgewhile[distance_min] = 0, 0 
     xEdgewhile = np.ma.masked_where(xEdgewhile == 0, xEdgewhile) 
     yEdgewhile = np.ma.masked_where(yEdgewhile == 0, yEdgewhile) 

僅供參考,我也可以給你的MATLAB代碼,如果有幫助。長話短說,我試圖通過使用邏輯零或任何其他方式刪除數組中的精確點。

+0

爲什麼不把你不想使用的值設置爲NaN或inf? – Trogdor 2014-08-29 16:16:19

回答

1

不確定我完全理解上下文,但是在提及「長話短說」時,有幾種方法可以刪除數組中的特定點。如果要刪除與特定值相對應的元素,則可以使用邏輯來選擇除那些具有該值以外的所有數組元素。例如,

import numpy as np 
a = np.array([1, 2, 3, 4, 5]) 
val = 3 
# If you want to delete the value 
b = a[a != val] 
# If you want the value to become something else (eg. 0) 
a[a == val] = 0 

請注意,這隻會工作,你好像一直到想要的工作,如果你的數組中只出現一次val。如果你有,你要刪除的元素的索引,使用numpy.delete()作爲參考here

numpy.delete(a, index) 

或者,如果你不想把它刪除,而只是希望把它變成另一個值(例如。 0),

a[index] = 0 

編輯

話又說回來,如果你不希望與所有的原始排列混亂,但只想把特定的元素出於什麼考慮,你可以使用一個IND ex數組並刪除相應的元素。例如,從這個序列輸出

b = np.arange(len(a)) 
# Begin algorithm on a[b] 
# Once an element is found in a and should no longer be considered... 
b = np.delete(b, index) 
# Repeat 

注意當指數,比方說,2

>>> b = np.arange(len(a)) 
>>> a[b] 
array([1, 2, 3, 4, 5]) 
>>> b = np.delete(b, 2) 
>>> a[b] 
array([1, 2, 4, 5]) 

使用這種方法,您可以留下您的陣列固定的,而是動態地修改你的考慮範圍。

0

比你的答案。

問題來自於Numpy數組的維度是固定的,因此不可能刪除他們的任何項目。解決方案可以將值替換爲您的函數無法實現的值,或者使用列表而不是數組。

+0

感謝您的澄清。幾個簡短的筆記。如果您想回答答案,SO上的首選方法是將答覆添加爲原始答案的評論,而不是單獨回答。另外,我很高興你讚賞這個答案。一般來說,如果您找到對SO有好處或有幫助的答案,對答案進行「投票」是一種很好的做法。如果確實回答了您的問題,那麼最好單擊該答案上的「接受」。最後,我根據你的評論編輯了我的答案。 – philE 2014-09-13 06:57:20