2

そのため、関数numpy.ma.whereと同じように、を使用して配列を作成しようとしています。numpy.where関数はwhere列配列をブロードキャストし、一部の要素をゼロに置き換えます。私は以下を取得します:

>>> import numpy
>>> condition = numpy.array([True,False, True, True, False, True]).reshape((3,2))
>>> print (condition)
[[ True False]
 [ True  True]
 [False  True]]
>>> broadcast_column = numpy.array([1,2,3]).reshape((-1,1)) # Column to be broadcast
>>> print (broadcast_column)
[[1]
 [2]
 [3]]
>>> numpy.where(condition, broadcast_column, 0) \
... # Yields the expected output, column is broadcast then condition applied
array([[1, 0],
       [2, 2],
       [0, 3]])
>>> numpy.ma.where(condition, broadcast_column, 0).data \
... # using the ma.where function yields a *different* array! Why?
array([[1, 0],
       [3, 1],
       [0, 3]], dtype=int32)
>>> numpy.ma.where(condition, broadcast_column.repeat(2,axis=1), 0).data \
... # The problem doesn't occur if broadcasting isnt used
array([[1, 0],
       [2, 2],
       [0, 3]], dtype=int32)

助けてくれて本当にありがとうございます!

私のnumpyバージョンは1.6.2です

4

1 に答える 1

2

中心となるのnp.ma.whereはステートメントです:(Ubuntuでは、/ usr / share / pyshared / numpy / ma / core.pyを参照してください)

np.putmask(_data, fc, xv.astype(ndtype))

_data返されるマスクされた配列のデータです。

fc条件がTrueの場合にTrueであるブール配列です。

xv.astype(ndtype)挿入する値です。例:broadcast_column

In [90]: d = np.empty(fc.shape, dtype=ndtype).view(np.ma.MaskedArray)

In [91]: _data = d._data

In [92]: _data
Out[92]: 
array([[5772360, 5772360],
       [      0,      17],
       [5772344, 5772344]])

In [93]: fc
Out[93]: 
array([[ True, False],
       [ True,  True],
       [False,  True]], dtype=bool)

In [94]: xv.astype(ndtype)
Out[94]: 
array([[1],
       [2],
       [3]])

In [95]: np.putmask(_data, fc, xv.astype(ndtype))

In [96]: _data
Out[96]: 
array([[      1, 5772360],
       [      3,       1],
       [5772344,       3]])

配列の中央の行にある3と1に注目してください。

問題は、np.putmask値をブロードキャストせず、それらを繰り返すことです。

のdocstringからnp.putmask

putmask(a、mask、values)

a.flat[n] = values[n]nごとに設定しmask.flat[n]==Trueます。

valuesがと同じサイズでない場合は、aが繰り返さmaskれます。これにより、とは異なる動作が得られますa[mask] = values

明示的にブロードキャストするとflat、必要なフラット化された値が返されます。

In [97]: list(broadcast_column.repeat(2,axis=1).flat)
Out[97]: [1, 1, 2, 2, 3, 3]

しかし、あなたが放送しないなら、

In [99]: list(broadcast_column.flat) + list(broadcast_column.flat)
Out[99]: [1, 2, 3, 1, 2, 3]

正しい値が目的の位置にありません。


PS。numpyの最新バージョンでは、コードは次のようになります。

np.copyto(_data, xv.astype(ndtype), where=fc)

これが動作にどのような影響を与えるかはわかりません。テストするのに十分な新しいnumpyのバージョンがありません。

于 2012-10-27T11:09:59.727 に答える