use*_*979 4 python arrays numpy intersection
对于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]])
Run Code Online (Sandbox Code Playgroud)
我知道有一种方法可以使用in1d和广播A作为一维数组,但我不知道如何去做.
任何帮助将不胜感激.
如果您将切片的2D数组A[:,3:]输入,它会将其展平为1D数组并与出现次数进行比较,从而创建1D掩码,该掩码可以重新整形并用于布局索引到该切片数组以将元素设置为.单线程实现看起来像这样 - np.in1dBTRUEzeros
A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0
Run Code Online (Sandbox Code Playgroud)
样品运行 -
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]])
Run Code Online (Sandbox Code Playgroud)
为了简化操作,您可以创建展平视图,A并使用从中获得的1D蒙版以获得np.in1d更优雅的解决方案.对于只更改切片的解决方案A[:,3:],您可以使用.flat然后索引,如此 -
A[:,3:].flat[np.in1d(A[:,3:],B)] = 0
Run Code Online (Sandbox Code Playgroud)
对于您希望在整个过程中设置匹配的情况A,您可以使用.ravel()-
A.ravel()[np.in1d(A,B)] = 0
Run Code Online (Sandbox Code Playgroud)
我知道.ravel()是一个观点,从文档来看,似乎.flat也没有创建副本,所以这些应该是便宜的.
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |