Αντικατάσταση όλων των στοιχείων του Python NumPy Array που είναι μεγαλύτερα από κάποια τιμή

Έχω έναν πίνακα 2D NumPy και θα ήθελα να αντικαταστήσω όλες τις τιμές σε αυτόν που είναι μεγαλύτερες ή ίσες από ένα κατώφλι T με 255,0. Απ' όσο γνωρίζω, ο πιο θεμελιώδης τρόπος θα ήταν ο εξής:

shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
    for y in range(0, shape[1]):
        if arr[x, y] >= T:
            result[x, y] = 255
  1. Ποιος είναι ο πιο συνοπτικός και πυθωνικός τρόπος για να γίνει αυτό;

  2. Υπάρχει ταχύτερος (ενδεχομένως λιγότερο συνοπτικός ή/και λιγότερο πυθωνικός) τρόπος για να γίνει αυτό;

Αυτό θα αποτελέσει μέρος μιας υπορουτίνας ρύθμισης παραθύρου/επιπέδου για μαγνητικές τομογραφίες του ανθρώπινου κεφαλιού. Ο πίνακας numpy 2D είναι τα δεδομένα εικονοστοιχείων της εικόνας.

Λύση

Νομίζω ότι τόσο ο ταχύτερος όσο και ο πιο συνοπτικός τρόπος για να το κάνετε αυτό είναι να χρησιμοποιήσετε την ενσωματωμένη ευρετηρίαση Fancy της NumPy's. Αν έχετε μια ndarray με όνομα arr, μπορείτε να αντικαταστήσετε όλα τα στοιχεία >255 με μια τιμή x ως εξής:

arr[arr > 255] = x

Το έτρεξα αυτό στο μηχάνημά μου με έναν τυχαίο πίνακα 500 x 500, αντικαθιστώντας όλες τις τιμές >0,5 με 5, και χρειάστηκαν κατά μέσο όρο 7,59ms.

In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)
In [3]: timeit A[A > 0.5] = 5
100 loops, best of 3: 7.59 ms per loop
Σχόλια (9)

Μπορείτε να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε numpy.putmask:

np.putmask(arr, arr>=T, 255.0)

Εδώ είναι μια σύγκριση επιδόσεων με την ενσωματωμένη ευρετηρίαση του Numpy's:

In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)

In [3]: timeit np.putmask(A, A>0.5, 5)
1000 loops, best of 3: 1.34 ms per loop

In [4]: timeit A[A > 0.5] = 5
1000 loops, best of 3: 1.82 ms per loop
Σχόλια (1)