Python 基于mask的全局数组子集的Numpy生成

Python 基于mask的全局数组子集的Numpy生成,python,numpy,where,mask,Python,Numpy,Where,Mask,我感兴趣的是,基于使用numpy的匹配布尔掩码,为特定轴从全局二维数组生成np.array列表(或np.array)。我想知道是否可以使用np.ma.mask()或类似的 举个例子可能更好: number= 10 x = np.linspace(0,number,num=number+1,dtype=int) B = np.vstack((x%3==0, x%2==0, x%1==0)) X = np.vstack((x//3, x//2, x-1)) list_ = [] for i in

我感兴趣的是,基于使用numpy的匹配布尔掩码,为特定轴从全局二维数组生成np.array列表(或np.array)。我想知道是否可以使用np.ma.mask()或类似的

举个例子可能更好:

number= 10
x = np.linspace(0,number,num=number+1,dtype=int)
B = np.vstack((x%3==0, x%2==0, x%1==0))
X = np.vstack((x//3, x//2, x-1))

list_ = []
for i in range(1,number+1):
    pointer = X[:,i][B[:,i]]
    list_.append(pointer)

print(list_)
[array([0]), array([1, 1]), array([1, 2]), array([2, 3]), array([4]), array([2, 3, 5]), array([6]), array([4, 7]), array([3, 8]), array([5, 9])]
在for循环中,我基本上是基于布尔掩码B提取二维数组X中轴=1上的值。我通过在轴=0上迭代并选择X[:,I][B[:,I]]来实现这一点。我想知道是否有可能在没有循环的情况下完成这项工作,因为范围可能非常大,并且完全在numpy中完成,也许可以在np.ma.array(X,mask=B)上使用where语句


干杯

以下是我将遵循的步骤,以矢量化的方式解决这个问题-

  • 使用
    布尔索引
    X
    中选择有效元素
  • 获取我们看到输入掩码的列索引移动的索引。这将在使用
    np.where
    转换掩码并选择第一个输入参数后实现
  • 最后,使用这些索引分割步骤1中获得的有效元素数组
  • 实现如下所示-

    cut_idx = np.unique(np.where(B[:,1:].T)[0],return_index=True)[1]
    out_list_ = np.split(X[:,1:].T[B[:,1:].T],cut_idx[1:])