二维和一维 Numpy 数组的交集
Intersection of 2d and 1d Numpy array
对于数组 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
作为一维数组广播,但我不知道该怎么做。
如有任何帮助,我们将不胜感激。
如果您将切片的二维数组 A[:,3:]
馈入 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
并使用从 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
也没有创建副本,所以这些应该 便宜 .
这是一种不使用 in1d()
的方法。您可以将常规 Python in
运算符与数组的 ravel
-ed 版本一起使用:
listed = [aa in B for aa in A[:, 3:].ravel()]
# mask for unaffected left columns of A
mask1 = np.array([False]*A.shape[0]*3)
mask1.shape = (A.shape[0], 3)
# mask for affected right columns of A
mask2 = np.array(listed)
mask2.shape = (A.shape[0], A.shape[1]-3)
# join masks together so you have a mask with same dimensions as A
mask = np.hstack((mask1, mask2))
result = A.copy()
result[mask] = 0
或更简洁:
listed = [aa in B for aa in A[:, 3:].ravel()]
listed_array = np.array(listed)
listed.shape = (A.shape[0], A.shape[1]-3)
A[:, 3:][listed_array] = 0
使用 in1d()
可能会更好,但很高兴知道还有其他选择。
对于数组 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
作为一维数组广播,但我不知道该怎么做。
如有任何帮助,我们将不胜感激。
如果您将切片的二维数组 A[:,3:]
馈入 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
并使用从 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
也没有创建副本,所以这些应该 便宜 .
这是一种不使用 in1d()
的方法。您可以将常规 Python in
运算符与数组的 ravel
-ed 版本一起使用:
listed = [aa in B for aa in A[:, 3:].ravel()]
# mask for unaffected left columns of A
mask1 = np.array([False]*A.shape[0]*3)
mask1.shape = (A.shape[0], 3)
# mask for affected right columns of A
mask2 = np.array(listed)
mask2.shape = (A.shape[0], A.shape[1]-3)
# join masks together so you have a mask with same dimensions as A
mask = np.hstack((mask1, mask2))
result = A.copy()
result[mask] = 0
或更简洁:
listed = [aa in B for aa in A[:, 3:].ravel()]
listed_array = np.array(listed)
listed.shape = (A.shape[0], A.shape[1]-3)
A[:, 3:][listed_array] = 0
使用 in1d()
可能会更好,但很高兴知道还有其他选择。