Wenden Sie den Vorgang auf alle Elemente in der Matrix an und überspringen Sie numpy.nanPython

Python-Programme
Guest
 Wenden Sie den Vorgang auf alle Elemente in der Matrix an und überspringen Sie numpy.nan

Post by Guest »

Ich habe ein Array, das nur in den unteren Dreiecksräumen mit Daten gefüllt ist, der Rest ist np.nan. Ich möchte einige Operationen an dieser Matrix durchführen, genauer gesagt – mit Datenelementen, nicht mit Nanos, weil ich erwarte, dass das Verhalten beim Überspringen von Nanos-Elementen in vektorisierten Operationen viel schneller abläuft.
I habe zwei Testarrays:

Code: Select all

arr = np.array([
[1.111, 2.222, 3.333, 4.444, 5.555],
[6.666, 7.777, 8.888, 9.999, 10.10],
[11.11, 12.12, 13.13, 14.14, 15.15],
[16.16, 17.17, 18.18, 19.19, 20.20],
[21.21, 22.22, 23.23, 24.24, 25.25]
])

arr_nans = np.array([
[np.nan, np.nan, np.nan, np.nan, np.nan],
[6.666, np.nan, np.nan, np.nan, np.nan],
[11.11, 12.12, np.nan, np.nan, np.nan],
[16.16, 17.17, 18.18, np.nan, np.nan],
[21.21, 22.22, 23.23, 24.24, np.nan]
])
So teste ich sie:

Code: Select all

test = timeit.timeit('arr * 5 / 2.123', globals=globals(), number=1000)
test_nans = timeit.timeit('arr_nans * 5 / 2.123', globals=globals(), number=1000)

masked_arr_nans = np.ma.array(arr_nans, mask=np.isnan(arr_nans))
test_masked_nans = timeit.timeit('masked_arr_nans * 5 / 2.123', globals=globals(), number=1000)

print(test)                 # 0.0017232997342944145s
print(test_nans)            # 0.0017070993781089783s
print(test_masked_nans)     # 0.052730199880898s
Ich habe ein Maskenarray masked_arr_nans erstellt und alle Nans maskiert. Aber dieser Weg ist viel langsamer als die ersten beiden. Ich verstehe nicht warum.
Die Hauptfrage ist: Welches ist der schnellste Weg, mit Arrays wie arr_nans zu arbeiten, die viele Nans enthalten? Wahrscheinlich gibt es einen schnelleren Ansatz als den diejenigen, die ich erwähnt habe.
Eine Nebenfrage ist: Warum arbeitet maskiertes Array viel langsamer?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post