因此,假设我有一个看起来像这样的列表:
x = [1, 0, 0, 1, 1, 1, 0, 0, 0, 0]
然后我还有另一个列表,其中的索引需要从列表x
中删除:
x_remove = [1, 4, 5]
然后我可以使用numpy
命令delete
从x
删除它,最后得到:
x_final = np.delete(x, x_remove)
>>> x_final = [0, 0, 1, 0, 0, 0, 0]
到目前为止,一切都很好。现在,我发现我不想使用整个列表x
,但也许从索引2开始。所以基本上:
x_new = x[2:]
>>> x_new = [0, 1, 1, 1, 0, 0, 0, 0]
但是,我仍然需要从x_remove
列表中删除索引,但是现在,如您所见,索引与以前的位置不同,因此删除了错误的项目。如果我以其他方式进行操作(即先删除索引,然后使用slice从索引2开始),也会发生同样的事情。因此,基本上/应该看起来像:
x_new_final = [0, 1, 1, 0, 0] (first use slice, and the remove list)
x_new_final_v2 = [1, 0, 0, 0, 0] (first use remove list, and then slice)
x_new_final_correct_one = [0, 1, 0, 0, 0, 0] (as it should be)
那么,是否可以通过某种方式(通过切片)以各种索引开始列表,并且仍然使用delete
命令删除与完整列表相对应的正确索引?
答案 0 :(得分:0)
您可以根据切片位置更改x_remove列表。例如:
slice_location = 2
x = [1, 0, 0, 1, 1, 1, 0, 0, 0, 0]
x_remove = [1, 4, 5]
x_new=x[slice_location:]
x_remove = [x-slice_location for x in x_remove if x-slice_location>0]
x_new = np.delete(x, x_remove)
答案 1 :(得分:0)
<TextBox Text="{Binding MinAmount, StringFormat={}{0:C0}.00}">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Language" Value="fr-FR" />
<Style.Triggers>
<DataTrigger Binding="{Binding Country}" Value="UK">
<Setter Property="Language" Value="en-GB" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
以简单的方式尝试...
答案 2 :(得分:0)
首先,让我们探索简单删除的替代方法(不改变起始位置问题)
首先使用独特且易于识别的值制作一个x
:
In [787]: x = list(range(10))
In [788]: x
Out[788]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表理解方法-可能不是最快的方法,但相当清晰且没有错误:
In [789]: [v for i,v in enumerate(x) if i not in x_remove]
Out[789]: [0, 2, 3, 6, 7, 8, 9]
您的np.delete
方法:
In [790]: np.delete(x, x_remove)
Out[790]: array([0, 2, 3, 6, 7, 8, 9])
将x
转换为数组有一个弊端,这不是一件容易的事(在时间上)。它还创建了一个新数组。我的猜测是它比较慢。
尝试就地移除:
In [791]: y=x[:]
In [792]: for i in x_remove:
...: del y[i]
...:
In [793]: y
Out[793]: [0, 2, 3, 4, 6, 8, 9]
糟糕-错误。我们需要从头开始(最大索引)。这是一个众所周知的Python“食谱”:
In [794]: y=x[:]
In [795]: for i in x_remove[::-1]:
...: del y[i]
...:
...:
In [796]: y
Out[796]: [0, 2, 3, 6, 7, 8, 9]
在幕后np.delete
采取掩盖的方式:
In [797]: arr = np.array(x)
In [798]: arr
Out[798]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [799]: mask = np.ones(arr.shape, bool)
In [800]: mask[x_remove] = False
In [801]: mask
Out[801]:
array([ True, False, True, True, False, False, True, True, True,
True])
In [802]: arr[mask]
Out[802]: array([0, 2, 3, 6, 7, 8, 9])
现在要解决的问题是将x_remove
应用于x
的一部分。 x
的分片没有分片参数的记录。那就是您不能轻易确定y = x[2:]
缺少两个值。 (嗯,我可以通过比较x
和y
的某些属性来推断出它,但不能单独从y
中得出)。
因此,无论您如何执行删除操作,都必须首先调整x_remove
的值。
In [803]: x2 = np.array(x_remove)-2
In [804]: x2
Out[804]: array([-1, 2, 3])
In [805]: [v for i,v in enumerate(x[2:]) if i not in x2]
Out[805]: [2, 3, 6, 7, 8, 9]
这行得通,但是-1
可能是一个问题。我们不希望它表示the last element
。因此,为了安全起见,我们必须首先过滤掉负面指标。
In [806]: np.delete(x[2:], x2)
/usr/local/bin/ipython3:1: FutureWarning: in the future negative indices will not be ignored by `numpy.delete`.
#!/usr/bin/python3
Out[806]: array([2, 3, 6, 7, 8, 9])
如果delete
不忽略负索引,则可能会得到这样的掩码-末尾带有False
:
In [808]: mask = np.ones(arr[2:].shape, bool)
In [809]: mask[x2] = False
In [810]: mask
Out[810]: array([ True, True, False, False, True, True, True, False])