2d和1d numpy数组的交集
对于数组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数组进行广播的方法,但是我不知道该如何进行。
任何帮助将不胜感激。
-
如果将切片的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
也没有创建副本,因此它们应该很 便宜 。