2d和1d numpy数组的交集

发布于 2021-01-29 15:05:55

对于数组A[:,3:]中也是数组中的每个元素B,我想将值设置为0,这将创建数组result

import numpy as np

A = np.array([[1, 1, 10, 101, 102, 103,   0,   0],
              [2, 2, 10, 102, 108,   0,   0,   0],
              [3, 3, 11, 101, 102, 106, 107, 108]])

B = np.array([101, 106, 108])

result = np.array([[1, 1, 10,   0, 102, 103,   0,   0],
                   [2, 2, 10, 102,   0,   0,   0,   0],
                   [3, 3, 11,   0, 102,   0, 107,   0]])

我知道有一种使用in1d和将其A作为1D数组进行广播的方法,但是我不知道该如何进行。

任何帮助将不胜感激。

关注者
0
被浏览
63
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果将切片的2D数组馈入A[:,3:]到其中,它将把它展平为1D数组并与之进行比较,从而创建一个1D蒙版,可以对其进行整形并用于对该切片数组进行布尔索引以将元素设置为。单线实施看起来像这样-
    np.in1d
    B``TRUE``zeros

    A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0
    

    样品运行-

    In [37]: A
    Out[37]: 
    array([[  1,   1,  10, 101, 102, 103,   0,   0],
           [  2,   2,  10, 102, 108,   0,   0,   0],
           [  3,   3,  11, 101, 102, 106, 107, 108]])
    
    In [38]: np.in1d(A[:,3:],B) # Flattened mask
    Out[38]: 
    array([ True, False, False, False, False, False,  True, False, False,
           False,  True, False,  True, False,  True], dtype=bool)
    
    In [39]: np.in1d(A[:,3:],B).reshape(A.shape[0],-1) # Reshaped mask
    Out[39]: 
    array([[ True, False, False, False, False],
           [False,  True, False, False, False],
           [ True, False,  True, False,  True]], dtype=bool)
    
    In [40]: A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0 # Final code
    
    In [41]: A
    Out[41]: 
    array([[  1,   1,  10,   0, 102, 103,   0,   0],
           [  2,   2,  10, 102,   0,   0,   0,   0],
           [  3,   3,  11,   0, 102,   0, 107,   0]])
    

    为了简化操作,您可以创建展平的视图A并使用从中获得的1D蒙版获得np.in1d更优雅的解决方案。对于仅更改切片的解决方案A[:,3:],您可以使用.flat,然后像这样进行索引-

    A[:,3:].flat[np.in1d(A[:,3:],B)] = 0
    

    如果您想在整个范围内设置匹配项A,可以使用.ravel()-

    A.ravel()[np.in1d(A,B)] = 0
    

    我知道这.ravel()是一个视图,从文档来看,它似乎.flat也没有创建副本,因此它们应该很 便宜



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看