numpy删除数组值(逻辑0)

时间:2014-08-29 09:50:29

标签: python arrays matlab numpy mask

短篇小说是:我试图通过逻辑零或任何其他方式删除数组中的精确点。

我从一些要点开始'定义机翼的坐标。有了它们,我试图形成一个没有交叉线的漂亮多边形。这是通过从第一点(任何一个点)开始,然后填充下一个点作为最接近第一个点的点来完成的。

坐标作为xEdge和yEdge加载。我做的第一件事就是创建一个副本,其中只有0,如下所示。 xEdgeOrdered和yEdgeOrdered将填充多边形点。我还将创建一个仅用于检查多边形已经采用的值的一个。

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

然后我们以y-maximum开始我们的多边形,这里就开始了问题。

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

在最后一行中,当我声明notUsed [startIndex] = 0时,我真正想要做的就是替换" USED"值为逻辑0 - " false"在matlab中。目的是该值不再可达,基本上从数组中删除。

我试图掩饰它(见下文),但我发现它在脚本的下一步中并不完美。

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

下一步是找到下一个最近点的循环。我将首先尝试用单词来描述我想要做的事情,然后我会附上我的代码(它还没有工作......)。

从初始点1开始,我需要使用矢量长度找到下一个最近的点。我将尝试所有剩余的点。要知道哪些是剩下的点,我给我的函数提供参数" notUsed",记住是一个带有" 1"的数组。如果不使用该点,或者如果使用该点则为0(0表示我们想表示" false"但我们还没有找到它们)。 我所做的是将xEdge的副本复制为xEdge,将我们刚刚使用的值设置为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代码。长话短说,我试图通过使用逻辑零或任何其他方式删除数组中的精确点。

2 个答案:

答案 0 :(得分: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在数组中只出现一次,这只会以您希望它的工作方式运行。如果您有要删除的元素的索引,请使用引用herenumpy.delete()

numpy.delete(a, index)

或者,如果您不想删除它,但只想将其转换为其他值(例如0),

a[index] = 0

修改

然后,如果您根本不想弄乱原始数组但只是想要考虑特定元素,则可以使用索引数组并相应地删除其中的元素。例如,

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])

使用此方法,您可以保持数组固定,但动态修改您的考虑集。

答案 1 :(得分:0)

比你的回答。

问题来自于Numpy数组的维度是固定的,因此无法删除任何项目。解决方案可以是使用您的函数无法访问的另一个值替换该值,或者使用列表而不是数组。