numpy 使用布尔掩码集合将数组拆分为多个数组

vh0rcniy  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(88)

给定一个形状为(m,n)的数据数组和相同形状的布尔掩码数组。有没有一种方法可以在没有循环的情况下应用下面的例程:
1.将掩码数组的每一列应用于数据数组,获得子数组
1.存储所有子阵列
下面是一个循环解决方案

import numpy as np

arr = np.array([
    [1,2,3],
    [np.nan,5,6]
])

masks = np.array([
    [True, True, True],
    [False, True, True]
])

arrays = []

for i in range(masks.shape[1]):
    mask_i = masks[:, i]
    arr_i = arr[mask_i, :]
    arrays.append(arr_i)

探索潜在的解决方案:

  1. np.take不起作用,因为indices参数需要均匀的形状,而在某些情况下,我们可以采取更少的行,在其他更多的行。
    1.花式索引arr[masks,:]不适用于高维掩码
  2. np.split不起作用,因为它只能拆分以完成不重叠的子阵列
6mw9ycah

6mw9ycah1#

如果你不需要子数组作为示例(比如list中的指定元素),并且可以将它们都存储在一个np数组中,那么这个片段可能会有所帮助:

arr = np.array([
    [1,2,3],
    [np.nan,5,6]]) # (m, n)

masks = np.array([
    [True, True, True],
    [False, True, True]]) # (m, n)

arr_rep = np.repeat(arr[np.newaxis, :, :], masks.shape[1], axis=0) # (n, m, n)
masks = np.transpose(masks) # (n, m)

arrays = arr_rep[masks]

所以数组将有掩码-True行来自于。

相关问题