Je suis accro à l'utilisation de la fonction de vectorisation du module de calcul scientifique python numpy, donc un mémo pour moi En passant, cette fois, j'ai posté cet article en utilisant l'exemple de création d'un histogramme de l'image d'entrée dans le traitement d'image.
Vectorize est une fonction qui transforme une fonction python afin qu'une liste puisse être insérée en une qui prend une valeur comme argument. Chaque valeur du tableau d'entrée sera calculée en tant qu'argument et la valeur de retour sera vectorisée.
Tout d'abord, préparez une fonction dont la valeur de retour n'est pas une liste.
myfunc.py
def myfunc(a,b):
return a+b
print myfunc("hoge","Hoge")
La sortie ressemble à ceci:
"hogeHoge"
Pensez à plonger un vecteur dans ce myfunc.
myfunc.py
def myfunc(a,b):
return a+b
list = ["hoge","fuga"]
print myfunc(list,"Hoge")
Je veux que la sortie ressemble à ceci:
["hogeHoge","fugaHoge"]
Mais en réalité
TypeError: can only concatenate list (not "str") to list
Sera. C'est parce qu'il n'a pas été initialement défini pour prendre une liste comme argument. Cependant, vous pouvez obtenir la sortie attendue en vectorisant myfunc avec numpy.vectorize.
vfunc=numpy.vectorize(myfunc)
print vfunc(list,"Hoge")
La sortie est
["hogeHoge","fugaHoge"]
La liste est renvoyée. Maintenant, la vectorisation de la fonction est réalisée.
Je vais laisser un exemple plus pratique. Créez une fonction qui crée un histogramme de l'image d'entrée par traitement d'image.
import numpy as np
import cv2
from matplotlib import pyplot as plt
#Fonction de création d'un histogramme
def img_hist(src,bins_array):
x = np.where(src==bins_array,1,0)
count = np.count_nonzero(x)
return count
#Vectorisation
vhist = np.vectorize(img_hist)
vhist.excluded.add(0) #Le 0ème argument est passé à la fonction tel quel en tant que vecteur fixe
#Préparez un fichier source et un bac de l'histogramme
src = cv2.imread("origin/LENNA.pgm",flags=0)
bins_array = np.arange(256)
#Créer un histogramme
hist_array=vhist(src,bins_array)
#Visualisez l'histogramme
plt.plot(bins_array,hist_array)
plt.show()
L'image d'entrée est classique
En conséquence, l'histogramme suivant est obtenu.
Recommended Posts