1

簡単なタスクを実行しようとしていますが、簡単な解決策がわかりません。

同じサイズの 2 つの 2D 配列があります。1 つの配列は、単に 0 または 1 を含むマスク配列です。マスク配列のインデックスが 1 の場合は、値を別の配列に保持したいと考えています。

マスク配列は次のようになります。

mask    = [[0,0,0,0],[0,0,1,1],[0,0,0,1],[0,0,0,1]]

そして、次の 2 番目の配列があるとします。

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

ブール値に変換する場合はmask、numpy を使用してこれを行うことができます。maskl = np.array(mask, dtype=bool)まず、 andを使用して配列を numpy 配列に変換しますestarray = np.array(estarray)。それで:

>>> estarr[mask]
array([2, 2, 3, 4])
于 2012-06-14T19:48:26.427 に答える
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
于 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])

これが私のやり方です。これを別の関数として記述し、2つのリストを渡すことができるかもしれません。

もっと「エレガントな」方法があるかもしれませんが、それを行うためのもっと「効率的な」方法はないと思います。個人的には読みやすさが好きです。

于 2012-06-14T20:57:34.690 に答える