Python numpy删除数组值(逻辑零)
简短的故事是:我试图通过使用逻辑零或任何其他方式删除数组中的精确点。 我从定义机翼的一些点的坐标开始。使用它们,我试图形成一个没有交叉线的漂亮多边形。这是通过从点1(任何一个点)开始,然后填充下一个点作为最接近第一个点的点来完成的 坐标加载为xEdge和yEdge。我要做的第一件事是创建一个只有0的副本,如下所示。xEdgeOrdered和yEdgeOrdered将用多边形点填充。我还将创建一个,其中只有一个将用于检查多边形已经获取了哪些值Python numpy删除数组值(逻辑零),python,arrays,matlab,numpy,mask,Python,Arrays,Matlab,Numpy,Mask,简短的故事是:我试图通过使用逻辑零或任何其他方式删除数组中的精确点。 我从定义机翼的一些点的坐标开始。使用它们,我试图形成一个没有交叉线的漂亮多边形。这是通过从点1(任何一个点)开始,然后填充下一个点作为最接近第一个点的点来完成的 坐标加载为xEdge和yEdge。我要做的第一件事是创建一个只有0的副本,如下所示。xEdgeOrdered和yEdgeOrdered将用多边形点填充。我还将创建一个,其中只有一个将用于检查多边形已经获取了哪些值 xEdgeOrdered = np.zeros_lik
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时,我真正想做的是将“USED”值替换为逻辑0——即matlab中的“false”。这样做的目的是,该值不再可访问,基本上从数组中删除
我试图掩盖它(见下文),但我发现它在脚本的下一步中无法完美工作
notUsed = np.ma.masked_where(notUsed == 0, notUsed)
下一步是找到下一个最近点的循环。我将首先尝试用文字描述我正在尝试做的事情,然后附上我的代码(这还不起作用…)
从初始点1开始,我需要使用向量长度找到下一个最近的点。我将尝试所有剩余的要点。为了知道剩下的点是什么,我给我的函数一个参数“notUsed”,如果没有使用该点,它是一个带“1”的数组,如果使用了它,它是一个带“0”的数组(0表示“false”,但我们还没有找到它的用法)。我所做的是将xEdge的副本复制为xEdgewhile,将我们刚才使用的值设置为0,然后要求应该屏蔽value=0
一旦找到最小值,则记录索引位置。使用它,我们可以在xEdgeOrderedn中填充这个新点,并从这个新点开始继续循环。然而,在此之前,我们需要删除我们刚刚使用的索引,以便它不再可访问。如果我们在matlab中,我们将不使用(索引)=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)
i,z,min=1,0,'inf'
xEdgewhile=xEdge+[];yEdgewhile=yEdge+[];
当我
作为参考,我也可以给你的matlab代码,如果它有帮助。长话短说,我试图通过使用逻辑零或任何其他方式删除数组中的精确点。我不确定我是否完全理解上下文,但关于您的“长话短说”,有几种方法可以删除数组中的特定点。如果要删除与特定值对应的元素,可以使用logicals选择除具有该值的元素之外的所有数组元素。比如说,
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
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
请注意,如果val
在数组中只出现一次,则这只会按照您希望的方式工作。如果有要删除的元素的索引,请使用引用的numpy.delete()
或者,如果您不想删除它,只想将其转换为另一个值(例如0)
编辑
同样,如果您根本不想弄乱原始数组,只想不考虑特定的元素,那么可以使用索引数组并相应地删除该数组的元素。比如说,
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
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])
使用此方法,您可以使数组保持固定,但可以动态修改考虑因素集。比您更适合您的答案
这个问题源于Numpy数组的维度是固定的,因此不可能删除它们的任何项。解决方法可以是将该值替换为函数无法访问的另一个值,或者使用列表而不是数组。为什么不将不希望使用的值设置为NaN或inf?感谢您的澄清。一些简短的注释。如果您想回复某个答案,那么SO上的首选方法是将该回复添加为对原始答案的注释,而不是单独作为一个答案添加。另外,我很高兴你对我的回答表示感谢。一般来说,如果你发现一个答案是好的或有帮助的,那么“向上投票”这个答案被认为是好的做法。如果它确实回答了您的问题,也可以单击该答案上的“接受”。最后,我根据你的评论编辑了我的答案。