例如: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)]
但是,创建它有点问题。 我尝试创建一个空列表,但无法一次访问所有相关条目。 有一种优雅的方法吗?
答案 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], []]