Python:根据另一个2D数组的索引从2D数组中选择项目

时间:2012-06-14 19:44:41

标签: python sorting

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

我有两个相同大小的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

感谢您的帮助!

5 个答案:

答案 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]