小故事是:我試圖通過使用邏輯零或任何其他方式刪除數組中的精確點。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代碼,如果有幫助。長話短說,我試圖通過使用邏輯零或任何其他方式刪除數組中的精確點。
爲什麼不把你不想使用的值設置爲NaN或inf? – Trogdor 2014-08-29 16:16:19