我正在尝试做一个简单的任务,但无法找到快速解决方案。
我有两个相同大小的2D数组。一个数组是一个掩码数组,只包含0或1;我希望在掩码数组索引为1的任何数组中保留值。
掩码数组可能如下所示:
mask = [[0,0,0,0],[0,0,1,1],[0,0,0,1],[0,0,0,1]]
并说我有第二个阵列:
testarr = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
我想从[2,2,3,4]
中提取值testarr
。
感谢您的帮助!
答案 0 :(得分:3)
如果您将mask
转换为bools,则可以使用numpy执行此操作。首先使用maskl = np.array(mask, dtype=bool)
和estarray = np.array(estarray)
将数组转换为numpy数组。然后:
>>> estarr[mask]
array([2, 2, 3, 4])
答案 1 :(得分:2)
您可以使用zip
。
for mask_list,val_list in zip(arr1, arr2):
for m,v in zip(mask_list, val_list):
if m:
# put in results
答案 2 :(得分:2)
您可以使用itertools.chain展平列表,然后简单地遍历压缩列表,例如如下:
mask = [[0,0,0,0],[0,0,1,1],[0,0,0,1],[0,0,0,1]]
testarr = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
from itertools import chain, izip
print [x for m,x in izip(chain(*mask), chain(*testarr)) if m]
# output:
# [2, 2, 3, 4]
答案 3 :(得分:0)
mask = [[0,0,0,0],[0,0,1,1],[0,0,0,1],[0,0,0,1]]
testarr = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
n = len(mask)
m = len(mask[0])
filtered = []
for i in xrange(n):
for j in xrange(m):
if mask[i][j]:
filtered.append(testarr[i][j])
我就是这样做的。也许你可以把它写成一个单独的函数,然后传入两个列表。
可能会有更多“优雅”的方式,但我认为没有更多“有效”的方法可以做到这一点。我个人喜欢可读性。
答案 4 :(得分:0)
您也可以查看numpy.ma模块。 http://docs.scipy.org/doc/numpy/reference/maskedarray.html
import numpy as np
mask = np.array([[0,0,0,0],[0,0,1,1],[0,0,0,1],[0,0,0,1]],dtype=np.bool)
testarr = np.array([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]])
ma = np.ma.array(testarr, mask=np.invert(mask))
print ma[~ma.mask]
输出
[2 2 3 4]