Numpy生成基于掩码的全局数组子集

时间:2016-04-28 02:10:48

标签: python numpy where mask

我感兴趣的是从全局2D数组生成np.arrays的列表(或np.array),基于使用numpy的匹配布尔掩码,用于特定轴。我想知道是否可以使用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在2D数组X中提取轴= 1上的值。我通过迭代轴= 0并选择X [:,i]来实现这一点[双]]。我想知道是否可以在没有循环的情况下执行此操作,因为范围可能非常大,并且完全在numpy中完成,可能在np.ma.array(X,mask = B)上使用where语句?

干杯!

1 个答案:

答案 0 :(得分:1)

以下是我将以矢量化方式解决案例的步骤 -

  1. 使用boolean indexingX
  2. 中选择有效元素
  3. 获取我们看到列索引为输入掩码移位的索引。在使用np.where并选择第一个输入参数
  4. 转置蒙版后,可以实现此目的
  5. 最后,使用这些索引,拆分在步骤1中获得的有效元素数组。
  6. 实现看起来像这样 -

    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:])