繁体   English   中英

2d和1d Numpy阵列的交点

[英]Intersection of 2d and 1d Numpy array

对于数组A[:,3:]每个元素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作为一维数组广播,但我不知道如何解决这个问题。

任何帮助将不胜感激。

如果您将切片的2D数组A[:,3:]np.in1d ,它会将其展平为1D数组并与B进行比较以进行出现,从而创建1D掩码,可以对其进行重新整形并用于布尔索引进入该切片数组以将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获得的1D掩码来获得更优雅的解决方案。 对于只更改切片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()但很高兴知道还有其他选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM