Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy删除数组值(逻辑零)_Python_Arrays_Matlab_Numpy_Mask - Fatal编程技术网

Python numpy删除数组值(逻辑零)

Python numpy删除数组值(逻辑零),python,arrays,matlab,numpy,mask,Python,Arrays,Matlab,Numpy,Mask,简短的故事是:我试图通过使用逻辑零或任何其他方式删除数组中的精确点。 我从定义机翼的一些点的坐标开始。使用它们,我试图形成一个没有交叉线的漂亮多边形。这是通过从点1(任何一个点)开始,然后填充下一个点作为最接近第一个点的点来完成的 坐标加载为xEdge和yEdge。我要做的第一件事是创建一个只有0的副本,如下所示。xEdgeOrdered和yEdgeOrdered将用多边形点填充。我还将创建一个,其中只有一个将用于检查多边形已经获取了哪些值 xEdgeOrdered = np.zeros_lik

简短的故事是:我试图通过使用逻辑零或任何其他方式删除数组中的精确点。

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

坐标加载为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时,我真正想做的是将“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上的首选方法是将该回复添加为对原始答案的注释,而不是单独作为一个答案添加。另外,我很高兴你对我的回答表示感谢。一般来说,如果你发现一个答案是好的或有帮助的,那么“向上投票”这个答案被认为是好的做法。如果它确实回答了您的问题,也可以单击该答案上的“接受”。最后,我根据你的评论编辑了我的答案。