Matrices y vectores#

image.png

import numpy as np
A=np.array(['a','b','c','d','e'])
x='e'
i=0
q=True
n=len(A)
while q and (i!=n) :
  q=not(A[i]==x)
  i=i+1
if i==n and q==True:
    print('No se encontró el elemento')
else:
    print('la posición es:',i-1,'El valor es:',A[i-1])
la posición es: 4 El valor es: e
A=np.array(['a','b','c','d','e'])
x='e'
i=0
n=len(A)
while i!=n:
  if A[i]==x:
    break
  i=i+1
if i==n:
    print('No se encontró el elemento')
else:
    print('la posición es:',i,'El valor es:',A[i])
la posición es: 4 El valor es: e

image.png

A=np.array(['a','b','c','d','e'])
x='c'
n=len(A)
A=np.append(A,x)

i=0
while not(A[i]==x):
  i=i+1
if i==n:
    print('No se encontró el elemento')
else:
    print('la posición es:',i,'El valor es:',A[i])
la posición es: 2 El valor es: c

image.png

import numpy as np
A=np.array([2,3,5,6,8,10,11])
x=11
i=0
j=len(A)
q=True
while q and (i<=j):
  k=(i+j)//2
  if A[k]==x:
    q=False
  else:
    if A[k]<x:
      i=k+1
    else:
      j=k-1
if q==True:
  print('No se encontró el elemento')
else:
  print('la posición es:',k,'El valor es:',A[k])
la posición es: 6 El valor es: 11

image.png

v1=[1,2,3,4]
v2=[4,5,6,7]
n=len(v1)
s=0
i=0
while i!=n:
  s=s+v1[i]*v2[i]
  i+=1
print('el producto escalar es: ',s)
el producto escalar es:  60

image.png

v1=[1,2,3,4]
v2=[4,5,6,7]
n=len(v1)
s=0
i=0
for i in range(n):
  s=s+v1[i]*v2[i]
print('el producto escalar es: ',s)
el producto escalar es:  60

image.png

A=[1,2,4,5,3,6,7]
j=0
k=0
for k in range(1,len(A)):
  if A[k]>A[j]:
    j=k
print('el elemento maximo es:',A[j], 'en la posición: ',j)
el elemento maximo es: 7 en la posición:  6

image.png

n=3
s=0
for x in range(1,n+1):
  potencia=1
  for i in range(1,x+1):
    potencia=potencia*x
  s=s+potencia
print('el resultado de la suma es: ',s)
el resultado de la suma es:  32
n=3
s=0
for x in range(1,n+1):
  s=s+x**x
print('el resultado de la suma es: ',s)
el resultado de la suma es:  32

image.png

x=np.random.randint(200, size=100)
h=0
for h in range(len(x)):
  j=h
  for k in range(h+1,len(x)):
    if x[k]>x[j]:
      j=k
  u=x[h]
  x[h]=x[j]
  x[j]=u
print(x)
[198 194 192 187 181 180 179 179 178 177 175 172 172 171 168 166 164 163
 161 161 160 158 156 154 152 147 146 146 146 142 140 135 135 130 128 126
 124 120 119 118 118 116 112 110 107 102 101 101 100 100  95  89  88  86
  84  83  82  82  82  81  81  80  77  76  73  73  72  71  69  68  67  66
  61  61  57  55  49  45  42  41  41  40  39  36  35  35  29  23  22  21
  18  17  15  13  12  12  10   8   6   0]

Numpy#

Con la librería numpy se trabaja con matrices de forma natural. Fíjate cómo se declaran y cómo descubrimos sus dimensiones.

https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf

import numpy as np

a = np.array([[1,2,3,4,5],
              [5,4,3,2,1],
              [9,8,7,6,5],
              [7,6,5,6,7],
              [2,2,2,3,3],
              [4,3,4,3,4],
              [5,1,1,4,1]]).astype('int32')

print(a, type(a),a.nbytes,"\n")
print("a shape", a.shape,"\n")
print("a rows", a.shape[0],"\n")
print("a cols", a.shape[1])
[[1 2 3 4 5]
 [5 4 3 2 1]
 [9 8 7 6 5]
 [7 6 5 6 7]
 [2 2 2 3 3]
 [4 3 4 3 4]
 [5 1 1 4 1]] <class 'numpy.ndarray'> 140 

a shape (7, 5) 

a rows 7 

a cols 5
a[0,0]=100
a
array([[100,   2,   3,   4,   5],
       [  5,   4,   3,   2,   1],
       [  9,   8,   7,   6,   5],
       [  7,   6,   5,   6,   7],
       [  2,   2,   2,   3,   3],
       [  4,   3,   4,   3,   4],
       [  5,   1,   1,   4,   1]], dtype=int32)
a.nbytes
140
v = np.array([2,3,4,5,6,7,3,12])
print("v shape", v.shape)
print("v elems", v.shape[0])
print(v, type(v))
v shape (8,)
v elems 8
[ 2  3  4  5  6  7  3 12] <class 'numpy.ndarray'>
v[3:-1]
array([5, 6, 7, 3])
np.min(v), np.max(v)
(2, 12)

Con la notación de índices accedemos a columas o filas enteras, rangos de columnas o filas, elementos individuales o porciones de una matriz o un vector.

print("una fila        "  ,a[2])
print("una fila        "  ,a[2,:])
print("una columna     "  ,a[:,2])
print("un elemento     "  ,a[2,2])
print("varias filas    \n",a[2:5])
print("varias columnas \n",a[:,1:3])
print("una porcion     \n",a[2:5,1:3])
una fila         [9 8 7 6 5]
una fila         [9 8 7 6 5]
una columna      [3 3 7 5 2 4 1]
un elemento      7
varias filas    
 [[9 8 7 6 5]
 [7 6 5 6 7]
 [2 2 2 3 3]]
varias columnas 
 [[2 3]
 [4 3]
 [8 7]
 [6 5]
 [2 2]
 [3 4]
 [1 1]]
una porcion     
 [[8 7]
 [6 5]
 [2 2]]

Muchas funciones de la librería numpy operan sobre una matriz completa, o de forma separada por columnas o filas según el valor del argumento axis.

print(a)
print("suma total", np.sum(a))
print("suma eje 0", np.sum(a, axis=0))
print("suma eje 1", np.sum(a, axis=1))
print("promedio total", np.mean(a))
print("promedio eje 0", np.mean(a, axis=0))
print("promedio eje 1", np.mean(a, axis=1))
[[100   2   3   4   5]
 [  5   4   3   2   1]
 [  9   8   7   6   5]
 [  7   6   5   6   7]
 [  2   2   2   3   3]
 [  4   3   4   3   4]
 [  5   1   1   4   1]]
suma total 237
suma eje 0 [132  26  25  28  26]
suma eje 1 [114  15  35  31  12  18  12]
promedio total 6.771428571428571
promedio eje 0 [18.85714286  3.71428571  3.57142857  4.          3.71428571]
promedio eje 1 [22.8  3.   7.   6.2  2.4  3.6  2.4]

Las matrices en Python pueden tener un número arbitrario de dimensiones y podemos acceder a submatrices en la dirección o dimensión que queramos.

z = np.random.randint(-20,20, size=(5,5))
print(z)
[[-19   4 -13 -19  13]
 [ 19   6  -9  -9 -16]
 [-11  12  -6 -20  16]
 [ -4  -1  -4  13   0]
 [-19  13  -1   9   8]]
np.sum(z, axis=1)
array([-34,  -9,  -9,   4,  10])
#m = np.random.randint(10, size=(3,3,3))
print("Matrix 3D completa\n", m)
print("----------\n", m[0,:,:])
print("----------\n", m[1,:,:])
print("----------\n", m[:,0,:])
print("----------\n", m[:,0,1])
print("----------\n", np.mean(m, axis=1))
Matrix 3D completa
 [[[7 0 8]
  [4 0 4]
  [3 4 9]]

 [[4 7 9]
  [2 2 6]
  [0 5 9]]

 [[8 6 9]
  [0 3 0]
  [0 9 2]]]
----------
 [[7 0 8]
 [4 0 4]
 [3 4 9]]
----------
 [[4 7 9]
 [2 2 6]
 [0 5 9]]
----------
 [[7 0 8]
 [4 7 9]
 [8 6 9]]
----------
 [0 7 6]
----------
 [[4.66666667 1.33333333 7.        ]
 [2.         4.66666667 8.        ]
 [2.66666667 6.         3.66666667]]
m.shape
(3, 3, 3)
m

Generación de matrices y vectores#

print("matrix identidad\n", np.eye(3))
print("vector de ceros", np.zeros(4))
print("matriz de ceros\n", np.zeros((3,2)))
print("matriz de unos\n", np.ones((2,3)))
print("vector rango", np.arange(10))
print("vector rango", np.arange(5,10))
print("vector espacio lineal", np.linspace(2,12,11))
print("matriz aleatoria según distribución uniforme [0,1]\n", np.random.random(size=(3,5)))
print("vector aleatorio de enteros entre 0 y 5", np.random.randint(5, size=10))
matrix identidad
 [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
vector de ceros [0. 0. 0. 0.]
matriz de ceros
 [[0. 0.]
 [0. 0.]
 [0. 0.]]
matriz de unos
 [[1. 1. 1.]
 [1. 1. 1.]]
vector rango [0 1 2 3 4 5 6 7 8 9]
vector rango [5 6 7 8 9]
vector espacio lineal [ 2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
matriz aleatoria según distribución uniforme [0,1]
 [[0.57996022 0.65361661 0.99420518 0.12111156 0.26731741]
 [0.206147   0.25575192 0.66588831 0.55022348 0.76820253]
 [0.51384056 0.63172996 0.50836505 0.41256526 0.66835632]]
vector aleatorio de enteros entre 0 y 5 [0 3 3 0 3 3 2 1 2 1]

Operaciones vectorizadas#

import numpy as np
v = np.array([10,12,13,15,20])
print(v)
print(v+1)
print(v*2)

a =  np.random.randint(100, size=5)
print(a)

print(v.dot(a))
[10 12 13 15 20]
[11 13 14 16 21]
[20 24 26 30 40]
[60 83 36 31 82]
4169
v1=np.array([2,-1,1])
v2=np.array([-3,1,1])
print(v1.dot(v2))
print(v1*v2)
print(np.cross(v2,v1))
print(np.cross(v1,v2).dot(v1))
print(np.cross(v1,v2).dot(v2))
-6
[-6 -1  1]
[2 5 1]
0
0
m1=np.array([[1,2],[3,4]])
m2=np.array([[4,8],[9,1]])
m1*m2
array([[ 4, 16],
       [27,  4]])
m1.dot(m2)
array([[22, 10],
       [48, 28]])
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[6,5,4],[3,2,1]])
c = np.array([[1,2],[4,5]])
print(a)
print("--")
print(a.T)
print("--")
print(b)
print("--")
print(a.T.dot(a))
print("--")
print(a*b)
print("--")
x=np.array([[2,3],[4,5]])
z=np.array([[5,6,7],[2,3,1]])
print(x.dot(z))
[[1 2 3]
 [4 5 6]]
--
[[1 4]
 [2 5]
 [3 6]]
--
[[6 5 4]
 [3 2 1]]
--
[[17 22 27]
 [22 29 36]
 [27 36 45]]
--
[[ 6 10 12]
 [12 10  6]]
--
[[16 21 17]
 [30 39 33]]

Las operaciones vectorizadas también funcionan con expresiones booleanas. Fíjate cómo se indexa un vector con una expresión booleana para seleccionar un conjunto de elementos.

a = np.array([1,8,4,10,-4,5])
print("posiciones en a >4:", a>4)
print("elementos de a >4:",a[a>4])
posiciones en a >4: [False  True False  True False  True]
elementos de a >4: [ 8 10  5]

Más operaciones vectorizadas#

a = np.random.randint(100, size=(6,10))
a
array([[14, 19,  5, 87, 99, 92, 31, 63, 18, 44],
       [81, 26, 65, 86,  2, 24, 99, 79, 71, 37],
       [42, 87,  8, 92, 63, 29, 31, 85, 75, 93],
       [59, 58, 97, 10, 12, 99, 86, 99, 28, 56],
       [76, 76, 75, 56, 49, 33, 51, 58, 41,  4],
       [35, 55, 41,  7, 42, 85, 53, 14, 22, 51]])
np.mean(a, axis=1)
array([47.2, 57. , 60.5, 60.4, 51.9, 40.5])
np.array([np.mean(a[i,:]) for i in range(a.shape[0])])
array([47.2, 57. , 60.5, 60.4, 51.9, 40.5])
%timeit np.mean(a, axis=1)
10.8 µs ± 2.4 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.array([np.mean(a[i,:]) for i in range(a.shape[0])])
43.7 µs ± 925 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Preguntate siempre si puedes vectorizar algo y hazlo. Por ejemplo, Para dos matrices (grandes).

a = np.random.randint(100, size=(1000,100))
b = np.random.randint(200, size=(1000,100))
# El número de elementos que son iguales
np.mean(a==b)
0.00512
# El promedio de los elementos de a que son mayores a su correspondiente posición en b

np.mean(a[a>b])
66.36604323536555
# El promedio de los elementos de b que son mayores a su correspondiente posición en a

np.mean(b[b>a])
122.37378653758725
# Con matrices más pequeñas
a = np.random.randint(100, size=(10))
b = np.random.randint(200, size=(10))
print (a)
print (b)
[73 19 71 47 95 38 48 59 74 61]
[ 68  94  69 142 167  40 190  70  33  95]
# el elemento en b correspondiente a la posición del elemento más grande en a
b[np.argmax(a)]
167

Broadcasting#

Normalmente, Numpy necesita que las dimensiones de las matrices coincidan cuando se hacen operaciones con ellas

a = np.random.randint(100, size=(3,5))
b = np.random.randint(10, size=(3,4))
print (a)
print (b)
a + b
[[83 58 25 73 33]
 [91 73 70 60 18]
 [20 86  0 23 62]]
[[7 2 4 0]
 [3 6 7 1]
 [7 9 5 2]]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-860cc8167430> in <cell line: 5>()
      3 print (a)
      4 print (b)
----> 5 a + b

ValueError: operands could not be broadcast together with shapes (3,5) (3,4) 

Pero numoy intentan expandir las operaciones si alguna de las dimensiones coincide

a
array([[83, 58, 25, 73, 33],
       [91, 73, 70, 60, 18],
       [20, 86,  0, 23, 62]])
a*10
array([[830, 580, 250, 730, 330],
       [910, 730, 700, 600, 180],
       [200, 860,   0, 230, 620]])
# Veamos como funciona el reshape en la siguiente operación.
a + b[:,1].reshape(-1,1)
array([[85, 60, 27, 75, 35],
       [97, 79, 76, 66, 24],
       [29, 95,  9, 32, 71]])
b[:,1].reshape(-1,1)
array([[2],
       [6],
       [9]])
b[:,1]
array([2, 6, 9])
a + b[:,1]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-d148e74cc6fe> in <cell line: 1>()
----> 1 a + b[:,1]

ValueError: operands could not be broadcast together with shapes (3,5) (3,) 
# Observa la forma de las filas
a + b.flatten()[:a.shape[1]]
array([[90, 60, 29, 73, 36],
       [98, 75, 74, 60, 21],
       [27, 88,  4, 23, 65]])
print (a)
print (b)
[[83 58 25 73 33]
 [91 73 70 60 18]
 [20 86  0 23 62]]
[[7 2 4 0]
 [3 6 7 1]
 [7 9 5 2]]
b.flatten()
array([7, 2, 4, 0, 3, 6, 7, 1, 7, 9, 5, 2])
b.flatten()[:a.shape[1]]
array([7, 2, 4, 0, 3])

Expresiones compactas / Comprehensions#

Fíjate cómo las siguientes expresiones son equivalentes:

a=15
if a > 10:
    s = "mayor que 10"
else:
    s = "menor que 10"

print(s)
mayor que 10
a = 15
s = "mayor que 10" if a > 10 else "menor que 10"
print(s)
mayor que 10
l=[]
for i in range(5):
    l.append(i)
print(l)
[0, 1, 2, 3, 4]
l=[i for i in range(5)]
print(l)
[0, 1, 2, 3, 4]
a = [10, -4, 20, 5]

#o = ["10A", "-4B", "20A", "5A"]

o = []
for i in a:
    if i<0:
        o.append(str(i)+"B")
    else:
        o.append(str(i)+"A")

print(o)
['10A', '-4B', '20A', '5A']
a = [10, -4, 20, 5]
def convert(x):
    return str(x)+"B" if x<0 else str(x)+"A"

o = [convert(i) for i in a]
print(o)
['10A', '-4B', '20A', '5A']
r = []
for i in range(10):
    r.append("el numero "+str(i))
print(r)
['el numero 0', 'el numero 1', 'el numero 2', 'el numero 3', 'el numero 4', 'el numero 5', 'el numero 6', 'el numero 7', 'el numero 8', 'el numero 9']
r = ["el numero "+str(i) for i in range(10)]
print(r)
['el numero 0', 'el numero 1', 'el numero 2', 'el numero 3', 'el numero 4', 'el numero 5', 'el numero 6', 'el numero 7', 'el numero 8', 'el numero 9']
frutas = {'Fresa':'roja', 'Limon':'verde', 'Papaya':'naranja', 'Manzana':'amarilla', 'Guayaba':'rosa'}
for nombre, color in frutas.items():
    print (nombre, "es de color", color)

print()
r = [nombre+" es de color "+color for nombre, color in frutas.items()]
r
Fresa es de color roja
Limon es de color verde
Papaya es de color naranja
Manzana es de color amarilla
Guayaba es de color rosa
['Fresa es de color roja',
 'Limon es de color verde',
 'Papaya es de color naranja',
 'Manzana es de color amarilla',
 'Guayaba es de color rosa']

Ejercicio#

Construir una matriz aleatoria de cuatro letras (A,T,C,G) de tamaño 100x1000 luego cambiar las letras por las siguientes codificaciones:

Codificación 1: -2,-1,1,2

Codificación 2: 0,1,2,3

Codifiación 3: 0001,0010,0100,1000

m=np.array([['A','T'],['C','G']])
m
array([['A', 'T'],
       ['C', 'G']], dtype='<U1')

Matplotlib#

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.linspace(-4,4,20)# El vector de tabulación
y=x**2
z=x**3

plt.plot(x, y, label="x^2 plot")
plt.scatter(x, y, label="muestras")
plt.plot(x, z, label="$x^3$", color="red")
plt.xlim([-4,4])
plt.ylim([-15, 15])
plt.legend()
plt.grid(True)
plt.xlabel('eje X')
plt.ylabel('eje y')
plt.title('Gráficas')
Text(0.5, 1.0, 'Gráficas')
../../../_images/eba5403d633b898a2e7d9633e5b11007d4653fd3ddfb30d8a266ed67382ae369.png
x = np.linspace(-4,4,20)
y=x**2

plt.figure(figsize=(10,10))
plt.scatter(x, y)
plt.grid(True)
plt.xlabel('eje X')
plt.ylabel('eje y')
plt.title('Parabola')

plt.figure(figsize=(10,10))
plt.plot(x, x**3)
plt.grid(True)
plt.xlabel('eje X')
plt.ylabel('eje y')
plt.title('$x^3$')
Text(0.5, 1.0, '$x^3$')
../../../_images/789affdb2c5d3d7e36e03d31ab078d5913bf1e207a7e11576ca6a557d3d03c1b.png ../../../_images/4e2a44d16bfe9753b547e6338a4d5391f26528021f1d43e95a6dba076198e609.png
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
plt.figure(figsize=(10,10))
x = np.linspace(-4,4,10)


plt.plot(x, x**2, color="black", linewidth=6)
plt.scatter(x, x**2, c="green", s=400)


x_r = np.linspace(-4,4,100)
x_ruido = x_r**2 + (np.random.random(x_r.shape)-0.5)*4
plt.scatter(x_r,x_ruido, c="red", alpha=0.3)
<matplotlib.collections.PathCollection at 0x7ff4845f44f0>
../../../_images/d449ecac101fef0bf03ed403267dc44ec2890943b5173b61617f04ac35089fcf.png
x=np.linspace(-4,4,100)
y=x
z=x**2
w=x**3
#plt.figure()
plt.subplot(1,3,1)
plt.plot(x,y)
plt.xlabel('ejex')
plt.ylabel('ejey')
plt.title('recta')
plt.grid()

#plt.figure()
plt.subplot(1,3,2)
plt.plot(x,z)
plt.xlabel('ejex')
plt.ylabel('ejey')
plt.title('parabola')
plt.grid()

#plt.figure()
plt.subplot(1,3,3)
plt.plot(x,w)
plt.xlabel('ejex')
plt.ylabel('ejey')
plt.title('cúbica')
plt.grid()
../../../_images/e28432ebc23eec52ef6b5f7895c0a2a353d3efa347dc6d12c16bb4007a2f8063.png

Imágenes#

from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
#Rei
#path_data = "/content/drive/MyDrive/Machine Learning 2023-1 UManizales Maestría/Clase 2/Data"
#Arteaga
path_data = "/content/drive/MyDrive/Clases 2023-01/Programación Concurrente y Distribuida/Semana 2-3/Introducción a Python/Data"

path_mesa = path_data+"/Mesa.jpg"
path_chestxray = path_data+"/ChestXRay.jpg"
from skimage import io
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

#Arteaga
img = io.imread(path_mesa)
img2 = io.imread(path_chestxray)

print("dimensiones", img.shape, "max", np.max(img), "min", np.min(img), "tipo",type(img))

plt.scatter(320,100, marker="x", s=200, linewidth=7, c="b")
plt.scatter(150,230, marker="x", s=200, linewidth=5, c="g")
print("pixel at blue marker ", img[100,320,:])
print("pixel at green marker", img[230,150,:])
img[100,:,:]=0
img[150,:,:]=255
#plt.grid() # remove gridlines
plt.imshow(img)
dimensiones (246, 360, 3) max 255 min 0 tipo <class 'numpy.ndarray'>
pixel at blue marker  [75  0  5]
pixel at green marker [ 24  48 112]
<matplotlib.image.AxesImage at 0x7ff45c6ccf10>
../../../_images/02f14bc95ae1bd87c3e19200f818c27922a21ec8188d08eb124c3346521d4501.png
img
array([[[ 90, 108, 132],
        [224, 254, 254],
        [ 64, 110, 143],
        ...,
        [173, 188, 191],
        [144, 162, 164],
        [172, 189, 196]],

       [[ 34,  61,  80],
        [212, 223, 241],
        [156, 201, 230],
        ...,
        [173, 192, 198],
        [173, 193, 200],
        [158, 187, 191]],

       [[ 27,  57,  83],
        [134, 141, 157],
        [172, 231, 247],
        ...,
        [195, 205, 207],
        [188, 193, 197],
        [175, 186, 190]],

       ...,

       [[ 44,  52,  55],
        [ 36,  45,  52],
        [ 38,  43,  46],
        ...,
        [119, 113,  97],
        [120, 122, 109],
        [122, 125, 130]],

       [[ 57,  47,  38],
        [ 54,  46,  43],
        [ 55,  52,  47],
        ...,
        [109,  99,  87],
        [113, 110,  91],
        [105, 108, 101]],

       [[ 58,  56,  57],
        [ 69,  70,  65],
        [ 61,  66,  69],
        ...,
        [139, 133, 119],
        [134, 119,  98],
        [132, 123, 108]]], dtype=uint8)
img = io.imread(path_mesa)
img[:,:,1]=0
img[:,:,2]=0
plt.imshow(img)

img = io.imread(path_mesa)
img[:,:,0]=0
img[:,:,2]=0
plt.figure()
plt.imshow(img)

img = io.imread(path_mesa)
img[:,:,0]=0
img[:,:,1]=0
plt.figure()
plt.imshow(img)
<matplotlib.image.AxesImage at 0x7ff45c4e0310>
../../../_images/425e8f1c75abc95d450c441c45f5b760c291f16ea79311cbccc9a439f641b433.png ../../../_images/3f534f4a21e645c860a376c04994775711ac0013201c70963fd67fc036f79e33.png ../../../_images/d5c2568ed53af4adcddea0c108fe541eb2c11077e2525a93675f1b6634f4e6d1.png
img = io.imread(path_mesa)
plt.imshow(img[:,:,1])
plt.figure()
plt.imshow(img[:,:,1], cmap = plt.cm.Greys_r)
<matplotlib.image.AxesImage at 0x7ff45c3c1700>
../../../_images/8cdcada20a02050493e7b77b026fbad924f569cd992cf8474bf17c2ab33b0dca.png ../../../_images/d0968c160dcba81251520ebeaf42bff25ca696e19c75c375b28c0bd555cfff90.png
# Otra imagen
print(img2.shape)
plt.imshow(img2)
(718, 1418, 3)
<matplotlib.image.AxesImage at 0x7ff45c3cd940>
../../../_images/0a5d57cd5c3abb55b0ee73c97fcb0d0ad0b376e5e61f4aa51e78c77905fb7b90.png

La manipulación de imágenes se reduce a realizar cálculos sobre los valores de luminosidad de cada pixel. Por ejemplo, obtenemos una versión en escala de grises promediando los valores RGB de cada pixel. Esto se hace de manera natural con la función np.mean y el argumento axis adecuado.

gimg = np.mean(img, axis=2)
print("dimensiones", gimg.shape, "max", np.max(gimg), "min", np.min(gimg))
plt.scatter(320,100, marker="x", s=200, linewidth=5, c="b")
plt.scatter(150,230, marker="x", s=200, linewidth=5, c="g")
print(img[100,320,:])
print("pixel at blue marker ", gimg[100,320])
print("pixel at green marker", gimg[230,150])
#plt.grid() # remove gridlines
plt.imshow(gimg, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
dimensiones (246, 360) max 255.0 min 0.0
[75  0  5]
pixel at blue marker  26.666666666666668
pixel at green marker 61.333333333333336
<matplotlib.image.AxesImage at 0x7ff45c182640>
../../../_images/b9fa31bc4b826ea99bdc589f1f31976d7a6cef5d9d98a11f7520399e7414ad7c.png

Ejercicio#

También podemos acceder a porciones (parches) de la imagen usando la notación natural de matrices de Python. Si además, reducimos la luminosidad de cada pixel a la mitad lo que hacemos es oscurecer la imagen.

  1. Cargar nuevamente la imagen de la mesa

  2. Visualizarla

  3. Obtener una nueva imágen promediando los 3 canales RGB

  4. Visualizarla

  5. Extraer el jarron de la posición 50:100 y 300:350 (ver imagen anterior)

  6. Visualizarla

  7. Dividir todos los pixeles del parche extraido (item 5) entre 2

  8. Compara los parches (visualiza usando los parámetros: cmap=”gray”, vmin=0, vmax=255), el original y el de división de cada pixel entre 2 ¿Qué observa?

# Escribe tu código aquí
gimg = np.mean(img, axis=2)
plt.imshow(gimg, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7ff45c160760>
../../../_images/e16baaad12911de1b97c5520ccddb49751ee36021b1108ea09834daf1a1d1987.png
gimg2=gimg/2
plt.imshow(gimg2, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7ff45c0a1b80>
../../../_images/51cea41e789bb2f9ef27d94583725a449f94a59a4111fd3b26fec76fed744118.png
jarron=gimg[50:100 , 300:350 ]
plt.imshow(jarron, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7ff44ecbee80>
../../../_images/ab03bfe9fb58c74813ae6508a3bab2e592c82eade57aef7d307eaeb11a2275c3.png
jarronOscurito=jarron/2
plt.imshow(jarronOscurito, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7ff44ec2b160>
../../../_images/05f30079b19d5c23212507f0f33dee50f0701a01efe2a87e4a6169d40f167145.png
plt.subplot(1,2,1)
plt.imshow(jarron, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
plt.subplot(1,2,2)
plt.imshow(jarronOscurito, cmap = plt.cm.Greys_r, vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7ff44e835fa0>
../../../_images/b7affd67a13c5405df35827661367ccaeab43636ef254701c909061fea05d4dc.png