我有以下数组:
a = [10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43] b = [0, 1, 4, 6]
我想根据数组b给出的索引掩码a。这意味着得到:
b
a
c = [True, True, False, False, True, False, True, False, False, False, False, False]
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,只需用途:
c
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的其他数组方法有
a[~c]
np.delete(a,b)
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)
628mspwn2#
在使用np.arange从a的长度创建的新数组上使用np.in1d:
np.arange
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)
xghobddn3#
它将是这样的:
c = [] for i, v in enumerate(a): mask = True if i in b else False c.append(mask)
jjjwad0x4#
res = [False] * len(a) for idx in b: res[idx] = True
或
[idx in b for idx in range(len(a))]
2ledvvac5#
我在这里找到了解决方案: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]
5条答案
按热度按时间vxbzzdmp1#
要使
b
索引处的布尔值c
为True,只需用途:然后,可以使用以下公式选择
a
的值:但是你也可以用
b
来选择它们:但是
c
更适合删除这些,a[~c]
.np.delete(a,b)
做同样的事情。生成
c
的其他数组方法有因为我刚刚在另一个问题中讨论了掩码数组,所以我可以在这里做同样的事情:
628mspwn2#
在使用
np.arange
从a
的长度创建的新数组上使用np.in1d
:xghobddn3#
它将是这样的:
jjjwad0x4#
或
2ledvvac5#
对于任何想要将其用于2D数组或N维数组的人:
我在这里找到了解决方案:https://zhangresearch.org/post/numpy-unravel-index
如果链接在将来某个时候失效,方法如下:
你得用“花式索引”