Έχω έναν πίνακα 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
Ποιος είναι ο πιο συνοπτικός και πυθωνικός τρόπος για να γίνει αυτό;
Υπάρχει ταχύτερος (ενδεχομένως λιγότερο συνοπτικός ή/και λιγότερο πυθωνικός) τρόπος για να γίνει αυτό;
Αυτό θα αποτελέσει μέρος μιας υπορουτίνας ρύθμισης παραθύρου/επιπέδου για μαγνητικές τομογραφίες του ανθρώπινου κεφαλιού. Ο πίνακας 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