【问题标题】:Numpy generation of subsets of global array based on mask基于掩码的全局数组子集的numpy生成
【发布时间】:2016-04-28 02:10:47
【问题描述】:

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

干杯!

【问题讨论】:

    标签: python numpy where mask


    【解决方案1】:

    以下是我将以矢量化方式解决此问题的步骤 -

    1. 使用boolean indexingX 中选择有效元素。
    2. 获取我们看到输入掩码的列索引移动的索引。这将在转置掩码后实现,使用 np.where 并选择第一个输入 arg。
    3. 最后,使用这些索引,拆分步骤 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:])
    

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多