访问列表列表中的非顺序多个条目

时间:2019-06-18 16:59:48

标签: python-3.x numpy indexing

我有M个向量的矩阵,其中每个向量的大小均为N(NxM)。 我还有一个布尔向量,大小为L> = M,正好有M个条目= True。 我想创建一个列表列表,并将M个矢量以布尔矢量为True的顺序放置在矩阵中,顺序与它们在矩阵中的顺序相同,其余的我想成为空列表

例如:M = 3,N = 4,L = 5

mat = np.array([[1, 5, 9],
               [2, 6, 10],
               [3, 7, 11],
               [4, 8, 12]])
mask = [True, False, True, True, False]

我要创建以下内容:

res = [ [1, 2, 3, 4], [], [5, 6, 7, 8], [9, 10, 11, 12], []]

可以使用以下方法进行访问:

data = [res[idx] for idx in range(len(res)) if mask(idx)]

但是,创建它有点问题。 我尝试创建一个空列表,但无法一次访问所有相关条目。 有一种优雅的方法吗?

3 个答案:

答案 0 :(得分:2)

这是我要怎么做:

mi = iter(mat.T.tolist())
[(m or []) and next(mi) for m in mask]
# [[1, 2, 3, 4], [], [5, 6, 7, 8], [9, 10, 11, 12], []]

答案 1 :(得分:1)

由于您已经在使用列表推导从 res 中获取 res 的数据,我将做类似的事情来在其中创建 res 第一名。

mask_cs = np.cumsum(mask) - 1  # array([0, 0, 1, 2, 2]) , gives the corresponding index in mat
res = [mat[:, mask_cs[idx]].tolist() if mask[idx] else [] for idx in range(L)]

作为交替访问mat的所有列的方法,on可以创建大小为[N,L]的中间数组

import numpy as np
res = np.zeros((N, L))  # Create result array
res[:, mask] = mat      # Copy the data at the right positions
res = res.T.tolist()    # Transform the array to a list of lists
for idx in range(L):    # Replace the columns with empty lists, if mask[idx] is False
    if not mask[idx]:
        res[idx] = []

答案 2 :(得分:1)

我们可以使用np.split进行一些优雅,例如-

In [162]: split_cols = np.split(mat.T,np.cumsum(mask)[:-1])

In [163]: split_cols
Out[163]: 
[array([[1, 2, 3, 4]]),
 array([], shape=(0, 4), dtype=int64),
 array([[5, 6, 7, 8]]),
 array([[ 9, 10, 11, 12]]),
 array([], shape=(0, 4), dtype=int64)]

因此,这给了我们2D数组的列表。为了获得所需的列表列表输出,我们需要将它们映射到这样的-

In [164]: list(map(list,(map(np.ravel,split_cols))))
Out[164]: [[1, 2, 3, 4], [], [5, 6, 7, 8], [9, 10, 11, 12], []]

或者,如果某些人看起来更优雅,我们可以使用lambda-

In [165]: F = lambda a: np.ravel(a).tolist()

In [166]: list(map(F,split_cols))
Out[166]: [[1, 2, 3, 4], [], [5, 6, 7, 8], [9, 10, 11, 12], []]