短篇小说是:我试图通过逻辑零或任何其他方式删除数组中的精确点。
我从一些要点开始'定义机翼的坐标。有了它们,我试图形成一个没有交叉线的漂亮多边形。这是通过从第一点(任何一个点)开始,然后填充下一个点作为最接近第一个点的点来完成的。
坐标作为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代码。长话短说,我试图通过使用逻辑零或任何其他方式删除数组中的精确点。
答案 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
在数组中只出现一次,这只会以您希望它的工作方式运行。如果您有要删除的元素的索引,请使用引用here的numpy.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数组的维度是固定的,因此无法删除任何项目。解决方案可以是使用您的函数无法访问的另一个值替换该值,或者使用列表而不是数组。