Vairāk
Aizstāt visus Python NumPy masīva elementus, kas ir lielāki par kādu vērtību
Man ir 2D NumPy masīvs, un es vēlētos aizstāt visas vērtības, kas tajā ir lielākas vai vienādas ar robežvērtību T, ar 255,0. Cik man zināms, visvienkāršākais veids būtu:
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
-
Kāds ir kodolīgākais un pitoniskākais veids, kā to izdarīt?
-
Vai ir kāds ātrāks (iespējams, mazāk kodolīgs un/vai mazāk pitonisks) veids, kā to izdarīt?
Tas būs daļa no loga/līmeņa pielāgošanas apakšprogrammas cilvēka galvas magnētiskās rezonanses skenēšanai. 2D numpy masīvs ir attēla pikseļu dati.
165
3
Manuprāt, ātrākais un kodolīgākais veids, kā to izdarīt, ir izmantot NumPy iebūvēto Fancy indeksēšanu. Ja jums ir
ndarray
ar nosaukumuarr
, jūs varat aizstāt visus elementus>255
ar vērtībux
šādi:Es to izmēģināju savā datorā ar 500 x 500 nejaušu matricu, aizstājot visas vērtības >0,5 ar 5, un tas aizņēma vidēji 7,59 ms.
Tā kā jūs faktiski vēlaties citu masīvu, kas ir
arr
, jaarr < 255
, un255
citos gadījumos, to var izdarīt vienkārši:Vispārīgāk, lai noteiktu apakšējo un/vai augšējo robežu:
Ja vēlaties piekļūt tikai vērtībām virs 255 vai kam sarežģītākam, @mtitan8'atbilde ir vispārīgāka, bet
np.clip
unnp.minimum
(vainp.maximum
) ir patīkamāka un daudz ātrāka jūsu gadījumā:Ja vēlaties to izdarīt uz vietas (t.i., modificēt
arr
, nevis izveidotrezultātu
), varat izmantotnp.minimum
parametruout
:vai
(
out=
vārds nav obligāts, jo argumenti ir tādā pašā secībā kā funkcijas definīcijā).)Vietas modifikācijas gadījumā bolu indeksēšana ievērojami paātrina darbību (bez nepieciešamības atsevišķi izveidot un pēc tam modificēt kopiju), bet joprojām nav tik ātra kā
minimum
:Salīdzinājumam, ja jūs vēlaties ierobežot vērtības ar minimumu un maksimumu, bez
clip
jums tas būtu jādara divreiz, izmantojot kaut ko līdzīgu.vai,
Varat apsvērt iespēju izmantot numpy.putmask:
Šeit ir snieguma salīdzinājums ar Numpy iebūvēto indeksēšanu: