numpy 用其他数组给出的索引对数组进行掩码

iyfjxgzm  于 2023-03-23  发布在  其他
关注(0)|答案(5)|浏览(140)

我有以下数组:

a = [10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43]
b = [0, 1, 4, 6]

我想根据数组b给出的索引掩码a。这意味着得到:

c = [True, True, False, False, True, False, True, False, False, False, False, False]
vxbzzdmp

vxbzzdmp1#

In [524]: a=np.array([10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43])
In [525]: b=np.array([0, 1, 4, 6])

要使b索引处的布尔值c为True,只需用途:

In [526]: c=np.zeros(a.shape, bool)
In [527]: c[b]=True

In [528]: c
Out[528]: 
array([ True,  True, False, False,  True, False,  True, False, False,
       False, False, False], dtype=bool)

然后,可以使用以下公式选择a的值:

In [529]: a[c]
Out[529]: array([10, 31, 17, 22])

但是你也可以用b来选择它们:

In [530]: a[b]
Out[530]: array([10, 31, 17, 22])

但是c更适合删除这些,a[~c] . np.delete(a,b)做同样的事情。
生成c的其他数组方法有

np.in1d(np.arange(a.shape[0]),b)
np.any(np.arange(a.shape[0])==b[:,None],0)

因为我刚刚在另一个问题中讨论了掩码数组,所以我可以在这里做同样的事情:

In [542]: np.ma.MaskedArray(a,c)
Out[542]: 
masked_array(data = [-- -- 30 11 -- 12 -- 25 85 17 21 43],
             mask = [ True  True False False  True False  True False False False False False],
       fill_value = 999999)
628mspwn

628mspwn2#

在使用np.arangea的长度创建的新数组上使用np.in1d

>>> a = [10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43]
>>> b = [0, 1, 4, 6]
>>> a = np.array(a)
>>> b = np.array(b)
>>> np.in1d(np.arange(len(a)), b)
array([ True,  True, False, False,  True, False,  True, False, False,
       False, False, False], dtype=bool)
xghobddn

xghobddn3#

它将是这样的:

c = []
for i, v in enumerate(a):
    mask = True if i in b else False
    c.append(mask)
jjjwad0x

jjjwad0x4#

res = [False] * len(a)
for idx in b:
    res[idx] = True

[idx in b for idx in range(len(a))]
2ledvvac

2ledvvac5#

对于任何想要将其用于2D数组或N维数组的人:

我在这里找到了解决方案:https://zhangresearch.org/post/numpy-unravel-index

如果链接在将来某个时候失效,方法如下:

你得用“花式索引”

>>> a = np.arange(20).reshape(4, 5)
>>> print(a)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
>>> b = np.array([[0, 0], [0, 1], [0, 3], [1, 1], [2, 2]])
>>> print(b)
[[0 0]
 [0 1]
 [0 3]
 [1 1]
 [2 2]]
>>> b_x = b[:, 0]
>>> b_y = b[:, 1]
>>> print(b_x)
[0 0 0 1 2]
>>> print(b_y)
[0 1 3 1 2]

>>> print(a[b_x, b_y])
[ 0  1  3  6 12]

相关问题