12

2D numpy 配列が与えられた場合、つまり;

import numpy as np

data = np.array([
     [11,12,13],
     [21,22,23],
     [31,32,33],
     [41,42,43],         
     ])

目的の行と列の 2 つのマスキング ベクトルに基づいて、サブ配列をその場で変更する必要があります。

rows = np.array([False, False, True, True], dtype=bool)
cols = np.array([True, True, False], dtype=bool)

つまり、

print data

 #[[11,12,13],
 # [21,22,23],
 # [0,0,33],
 # [0,0,43]]      
4

1 に答える 1

10

必要な行/列にアクセスする方法がわかったので、必要な値をサブ配列に割り当てますただし、少しトリッキーです。

mask = rows[:,None]*cols[None,:]
data[mask] = 0

その理由は、 (前の質問data[rows][:,cols]で示したように) としてサブ配列にアクセスすると、ビューのビューを取得しており、元のデータへの参照の一部が途中で失われるためです。

代わりに、ここでは 2 つの 1D 配列rowsをブロードキャストし、 cols1 つをもう 1 つにブロードキャストして、2D ブール配列を作成します。配列maskの形状は になり(len(rows),len(cols)ます。を使用maskして の元のアイテムに直接アクセスし、dataそれらを新しい値に設定します。すると、1D 配列が得られることに注意してください。これは、前の質問data[mask]で望んでいた答えではありませんでした。

マスクを構築するために、&代わりに演算子を使用することもできました*(ブール配列を扱っているため)、またはより単純なnp.outer関数を使用することもできます。

mask = np.outer(rows,cols)

編集:ソリューションについては@Marcus Jonesへの小道具np.outer

于 2012-09-15T12:16:36.883 に答える