1

我正在尝试做一个简单的任务,但无法找到一个快速的解决方案。

我有两个相同大小的二维数组。一个数组是只包含 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

谢谢你的帮助!

4

5 回答 5

3

If you convert your mask to bools, you can use numpy to do this. First convert your arrays to numpy arrays using maskl = np.array(mask, dtype=bool) and estarray = np.array(estarray). Then:

>>> estarr[mask]
array([2, 2, 3, 4])
于 2012-06-14T19:48:26.427 回答
2

You could use zip.

for mask_list,val_list in zip(arr1, arr2):
    for m,v in zip(mask_list, val_list):
       if m:
           # put in results
于 2012-06-14T19:47:35.020 回答
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]
于 2012-06-14T19:54:32.370 回答
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]
于 2012-06-15T00:19:33.703 回答
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])

我就是这样做的。也许你可以把它写成一个单独的函数,并传入两个列表。

可能有更多“优雅”的方式,但我不认为有更“有效”的方式来做到这一点。我个人喜欢可读性。

于 2012-06-14T20:57:34.690 回答