2017-11-23 5 views
1

Ich verwende die np.broadcast_to Funktion eine Ansicht auf ein neu geformtes Array zu erhalten wie das Beispiel:Numpy broadcast_to für maskierte Array

>>> x = np.array([1, 2, 3]) 
>>> np.broadcast_to(x, (3, 3)) 
array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

eine maskierte Array an diese Funktion Passing verliert mir die Maske aber:

>>> y = np.ma.array([1, 2, 3], mask=[False, True, False]) 
>>> np.broadcast_to(y, (3, 3)) 
array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

Wie bekomme ich die folgende Ansicht?

array([[1, --, 3], 
     [1, --, 3], 
     [1, --, 3]]) 
+0

'--' ist keine gültige Numpy noch Python-Kennung. Was soll "-" sein? Keiner? – Kasramvd

+1

@Kasramvd '--' wird in der Anzeige der maskierten Elemente für maskierte Arrays verwendet. –

+0

Ich habe erwartet, 'subok = True' in' np.broadcast_to' zu übergeben, um das gewünschte Ergebnis zurückzugeben, aber leider nicht. Die Maske wird nicht gesendet. –

Antwort

2

Anscheinend können Sie einen subok Parameter np.broadcast_to passieren den Typ des übergebenen Array zu behalten und nicht Verwenden Sie den Basis-Array-Typ, aber dies überträgt nur die Daten des maskierten Arrays, nicht die Maske.

Sie sollten wahrscheinlich die Maske anschließend manuell übertragen:

>>> y = np.ma.array([1, 2, 3], mask=[False, True, False]) 
>>> z = np.broadcast_to(y, (3, 3), subok=True) 
>>> z.mask 
False 
>>> z.mask = np.broadcast_to(y.mask, z.shape) 
>>> z 
masked_array(data = 
[[1 -- 3] 
[1 -- 3] 
[1 -- 3]], 
      mask = 
[[False True False] 
[False True False] 
[False True False]], 
     fill_value = 999999) 
1

Ich denke, das ist was du willst. Maskiere das Array nach dem Broadcast, damit du das gewünschte maskierte Array bekommst.

y = np.ma.array([1, 2, 3]) 
z = np.broadcast_to(y, (3, 3)) 
x = np.ma.array(z, mask=np.broadcast_to([False,True,False], (3, 3))) 
x 
masked_array(data = 
[[1 -- 3] 
[1 -- 3] 
[1 -- 3]], 
      mask = 
[[False True False] 
[False True False] 
[False True False]], 
     fill_value = 999999) 

Überprüfen Sie, ob dies für Ihren Fall funktioniert. Wenn Sie die maskierten Array-Werte ohne wollen ‚-‘

x.compressed() 
array([1, 3, 1, 3, 1, 3]) 

Für weitere Informationen gehen Sie durch Masked array documentation

+0

Ja, das sollte funktionieren. Ich kann "y.mask" anstatt "[0,1,0]" übergeben, um es allgemeiner zu machen. Das 'copy'-Argument wird standardmäßig auf' False' in der 'np.ma.array'-Funktion gesetzt, so dass es eine Ansicht zurückgeben sollte. Danke –

+0

Sie sind Willkommen! @DuncanWP –

Verwandte Themen