gpt4 book ai didi

python - 二维数组的 Numpy Delete

转载 作者:行者123 更新时间:2023-12-05 01:31:48 25 4
gpt4 key购买 nike

我有一个形状为 (10, 3) 的 ndarray 和一个长度为 10 的索引列表:

import numpy as np
arr = np.arange(10* 3).reshape((10, 3))
idxs = np.array([0, 1, 1, 1, 2, 0, 2, 2, 1 , 0])

我想使用 numpy delete(或更适合该任务的 numpy 函数)来删除 arr 中由每一行的 idxs 指示的值。因此,在 arr 的第零行中,我想删除第 0 个条目,在第一个中删除第一个,在第二个中删除第一个,依此类推。

我试过类似的东西

np.delete(arr, idxs, axis=1)

但它不会起作用。然后我尝试像这样构建一个索引列表:

idlist = [np.arange(len(idxs)), idxs]
np.delete(arr, idlist)

但这也没有给我想要的结果。

最佳答案

@Quang 的回答很好,但可能会从一些解释中受益。


np.delete 适用于整行或整列,而不是每行或整列的选定元素。

In [30]: arr = np.arange(10* 3).reshape((10, 3))
...: idxs = np.array([0, 1, 1, 1, 2, 0, 2, 2, 1 , 0])

从数组中选择项目很容易:

In [31]: arr[np.arange(10), idxs]
Out[31]: array([ 0, 4, 7, 10, 14, 15, 20, 23, 25, 27])

选择除这些之外的所有内容需要更多的工作。 np.delete 是复杂的通用代码,根据删除规范执行不同的操作。但它可以做的一件事是创建一个 True 掩码,并将删除项设置为 False

对于您的 2d 案例,我们可以:

In [33]: mask = np.ones(arr.shape, bool)
In [34]: mask[np.arange(10), idxs] = False
In [35]: arr[mask]
Out[35]:
array([ 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 16, 17, 18, 19, 21, 22, 24,
26, 28, 29])

boolean 索引生成平面数组,因此我们需要 reshape 以获得 2d:

In [36]: arr[mask].reshape(10,2)
Out[36]:
array([[ 1, 2],
[ 3, 5],
[ 6, 8],
[ 9, 11],
[12, 13],
[16, 17],
[18, 19],
[21, 22],
[24, 26],
[28, 29]])

Quand 的回答以另一种方式创建了面具:

In [37]: arr[np.arange(arr.shape[1]) != idxs[:,None]]
Out[37]:
array([ 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 16, 17, 18, 19, 21, 22, 24,
26, 28, 29])

关于python - 二维数组的 Numpy Delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65888864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com