2014-08-29 108 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