Skip to content

Commit 3f3d18d

Browse files
committed
Update numpy files
1 parent d92d9c3 commit 3f3d18d

File tree

10 files changed

+251
-21
lines changed

10 files changed

+251
-21
lines changed

Cheatsheets/img/np_sorting.png

10.9 KB
Loading

Cheatsheets/numpy.md

Lines changed: 73 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,79 @@ a = np.array([1, 2, 3, 4])
105105
b = np.array([5, 6, 7, 8])
106106
np.concatenate((a, b)) # [1, 2, 3, 4, 5, 6, 7, 8]
107107
```
108+
```python
109+
b = np.array([71,63,75])
110+
111+
b[ [0,2] ] # [ 71 75 ]
112+
113+
b[ [1,0,2] ] # [63 71 75]
114+
```
115+
116+
**argsort()**
117+
118+
```python
119+
c = np.array([99, 33, 66, 55, 77, 22, 11, 88, 44])
120+
121+
c_sorted = c[ np.argsort(c) ]
122+
print(c_sorted) # [11 22 33 44 55 66 77 88 99]
123+
```
124+
125+
#### Sorting 2D
126+
127+
For 2D arrays we can sort from left to right (axis 1) or from top to bottom (axis 0).
128+
129+
![sorting](./img/np_sorting.png)
130+
131+
* np.sort(a)
132+
* np.sort(a, axis=0)
133+
* np.sort(a, axis=1)
134+
135+
```python
136+
import numpy as np
137+
a = np.array([[99, 21, 33],
138+
[44, 55, 66],
139+
[71, 8, 53]])
140+
141+
simple = np.sort(a)
142+
# [[21 33 99]
143+
# [44 55 66]
144+
# [ 8 53 71]]
145+
146+
b = np.sort(a, axis=0) # top to bottom
147+
# [[44 0 33]
148+
# [71 21 53]
149+
# [99 55 66]]
150+
151+
c = np.sort(a, axis=1) # left to right
152+
# [[21 33 99]
153+
# [44 55 66]
154+
# [ 8 53 71]]
155+
```
156+
157+
```python
158+
a = np.array([[ 99, 21, 33 ],[ 44, 55, 66 ], [ 71, 0, 53 ]])
159+
# [[99 21 33]
160+
# [44 55 66]
161+
# [71 0 53]]
162+
163+
# sort 1st col
164+
a[ np.argsort(a[:,0]), : ]
165+
# [[44 55 66]
166+
# [71 0 53]
167+
# [99 21 33]]
168+
169+
# sort 2nd col
170+
a[ np.argsort(a[:,1]), : ]
171+
# [[71 0 53]
172+
# [99 21 33]
173+
# [44 55 66]]
174+
175+
# sort by 3rd col
176+
a[ np.argsort(a[:,2]), : ]
177+
# [[99 21 33]
178+
# [71 0 53]
179+
# [44 55 66]]
180+
```
108181

109182
### Dimension and size
110183
```python
@@ -154,15 +227,4 @@ csv_arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
154227
np.savetxt('new_file.csv', csv_arr)
155228
np.loadtxt('new_file.csv')
156229
```
157-
```python
158-
159-
```
160-
```python
161230

162-
```
163-
```python
164-
165-
```
166-
```python
167-
168-
```

Exercises/06.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,13 @@ Escribir una función que reciba una lista como entrada y que devuelva 0 si la l
114114
Podes verificar que tu función devuelva el valor correcto comparandola con la función primitiva de Python len().
115115

116116
```python
117-
def longitudLista(lista):
118-
return len(lista)
117+
def longitud(lista):
118+
if lista == []: # me fijo si la lista está vacia
119+
return 0
120+
else:
121+
# si la lista no está vacía, la función devuelve 1
122+
# más la longitud de la lista restante (es decir, la lista sin el primer elemento)
123+
return 1 + longitud(lista[1:])
119124
```
120125

121126
### Ejercicio 7 - Listas pares e impares
@@ -139,7 +144,7 @@ En este ejercicio vamos a estimar π generando puntos al azar (esto es un ejempl
139144
<br> b) Usando el array del inciso anterior, contá la cantidad de puntos que caen dentro del cículo (es decir, contá cuántos cumplen que x**2 + y**2 < 1). Luego estimá el valor de π dividiendo ese valor por la cantidad de puntos (o sea, en este caso 10000), y multiplicando el resultado por 4. ¿Dió similar al valor conocido de π?
140145
<br> c) Creá una función estimar_pi(n) que devuelva una estimación del valor de π como la que hiciste antes pero usando n puntos, donde n es el parámetro de entrada.
141146

142-
[Solución](./Weeks/Week%2005/3_acciones_uva.py)
147+
[Solución](./Weeks/Week06/9_estimar_pi.py)
143148

144149
### Ejercicio 10 - Ejercicio con datos antropométricos
145150
#### Descripcion
@@ -171,3 +176,17 @@ Calcular la relación entre altura del torso (sitting height) y longitud de las
171176
<br> b. ¿Que valores minimo, maximo, promedio, desvio tiene?
172177
<br> c. ¿Hay correlación entre los dos valores (longitud torso vs longitud de las piernas) para hombres y mujeres?
173178

179+
[Solución](./Weeks/Week06
180+
181+
### Ejercicio 11 - Sort pesos y alturas
182+
#### Descripcion
183+
Ordenar los datos por peso (o altura) y mantener los pares peso-altura de cada persona, sin hacer un array estructurado, y usando argsort().
184+
185+
```python
186+
# altura en metros de personas
187+
alturas = [1.73, 1.68, 1.71, 1.89, 1.79, 1.76, 1.67]
188+
# peso en Kg de personas
189+
pesos = [65.4, 59.2, 63.6, 88.4, 68.7, 89.7, 73.2]
190+
```
191+
192+
[Solucion](./Weeks/Week06/11_sort.py)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Explore los datos ANSUR I para mujeres y hombres
2+
# Cree funciones para poder trabajar con los dos conjuntos de datos de la misma forma para:
3+
# <br> a. Leer los datos con NumPy y armar un nuevo array que contenga solamente los pesos y alturas.
4+
# <br> b. Determinar cuáles son los valores máximo, mínimo y promedio de los pesos y alturas para hombres y mujeres por separado.
5+
# <br> c. Estudie si hay correlación entre el peso y la altura para cada conjunto de datos.
6+
#
7+
# Calcular la relación entre altura del torso (sitting height) y longitud de las piernas (se puede calcular como la resta de la altura del torso y la altura total.
8+
# <br> a. ¿Cómo es ese cociente?
9+
# <br> b. ¿Que valores minimo, maximo, promedio, desvio tiene?
10+
# <br> c. ¿Hay correlación entre los dos valores (longitud torso vs longitud de las piernas) para hombres y mujeres?
11+
import numpy as np
12+
ansurWomen = np.genfromtxt('../../../Data/ansurWomen.csv', delimiter=",", skip_header=1)
13+
14+
# explorar los datos: dimensiones, forma, filas, columnas, etc.
15+
print("Shape:", ansurWomen.shape, "Dim:", ansurWomen.ndim)
16+
print(ansurWomen[:,0])
17+
print(ansurWomen[0,:])
18+
19+
# donde está el peso? (weight?) → Index = 124
20+
pesos = ansurWomen[:,124]
21+
print("Pesos de las primeras 10 mujeres de la base de datos:\n", pesos[:10])
22+
23+
# donde está la altura? (stature) → Index = 99
24+
alturas = ansurWomen[:,99]
25+
print("Alturas de las primeras 10 mujeres de la base de datos:\n", alturas[:10])
26+
27+
28+
peso_stats = (pesos.min(), pesos.max(), round(pesos.mean(),4))
29+
altura_stats = (alturas.min(), alturas.max(), round(alturas.mean(),4))
30+
nombres_stats = ('Mínimo','Máximo','Promedio')
31+
print('\n')
32+
print("{:>10} {:>6} {:>8} {:>12}".format(" ", *nombres_stats))
33+
print("{:>10} {:>6} {:>8} {:>12}".format("PESO:", *peso_stats))
34+
print("{:>10} {:>6} {:>8} {:>12}".format("ALTURA:", *altura_stats))
35+
36+
37+
# 2.
38+
# A ansur_file hay que asignarle el path del archivo que se desea analizar.
39+
40+
def ansur(ansur_file):
41+
ansur = np.genfromtxt(ansur_file, delimiter=",", skip_header=1)
42+
# Creo la variable datos con: Columna 1: peso, Columna 2: alturas
43+
datos = np.transpose(np.stack((ansur[:,124], ansur[:,99])))
44+
# Tupla con el valor mínimo, máximo y promedio de los pesos respectivamente
45+
peso_stats = (datos[:,0].min(), datos[:,0].max(), round(datos[:,0].mean(),2))
46+
# Tupla con el valor mínimo, máximo y promedio de las alturas respectivamente
47+
altura_stats = (datos[:,1].min(), datos[:,1].max(), round(datos[:,1].mean(),2))
48+
# Calculo el coeficiente de correlación
49+
corr = np.corrcoef(datos[:,0], datos[:,1])
50+
return ansur, datos, peso_stats, altura_stats, corr # la función devuelve 5 variables (valores).
51+
52+
# Ejemplo para ejecutar sobre las mujeres:
53+
asur, datos, peso_stats, altura_stats, corr = ansur('/content/drive/MyDrive/Colab Notebooks/Data/ansurWomen.csv')
54+
# Imprimo una tabla con los datos. (No era necesario mostrarlo de esta forma)
55+
print("Para las Mujeres")
56+
print("{:>15} {:>8} {:>8} {:>10}".format("Característica", "Min", "Máx", "Promedio"))
57+
print("{:>15} {:>8} {:>8} {:>10}".format("PESO:", *peso_stats))
58+
print("{:>15} {:>8} {:>8} {:>10}".format("ALTURA:", *altura_stats))
59+
print(f"Correlación: {corr[0,1]}")
60+
61+
62+
# 3.a.
63+
import matplotlib.pyplot as plt
64+
ansurWomen = np.genfromtxt('/content/drive/MyDrive/Colab Notebooks/Data/ansurWomen.csv', delimiter=",", skip_header=1)
65+
66+
altura_torso = ansurWomen[:,93]
67+
long_piernas = ansurWomen[:,99] - altura_torso
68+
relacion = altura_torso / long_piernas
69+
70+
plt.figure(figsize=(15,5))
71+
plt.plot(relacion)
72+
# Al mirar los valores del cociente "relacion" podemos ver que es ligeramente mayor a 1 para toda la población.
73+
# Esto muestra que la tendencia es que no importa cuales sean la altura del torso y la longitud de las piernas, su cociente se mantiene
74+
# El desvio cuantifica la afirmación "el cociente se mantiene"
75+
76+
# 3.b.
77+
print(f"Promedio: {round(relacion.mean(),2)}, Max: {round(relacion.max(),2)}, Min: {round(relacion.min(),2)}, Desvio: {round(relacion.std(),2)}")
78+
79+
# 3.c.
80+
corr = np.corrcoef(altura_torso, long_piernas)
81+
print(f"Correlación: {round(corr[0,1],4)}")

Exercises/Weeks/Week06/11_sort.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import numpy as np
2+
3+
# altura en metros de personas
4+
alturas = [1.73, 1.68, 1.71, 1.89, 1.79, 1.76, 1.67]
5+
# peso en Kg de personas
6+
pesos = [65.4, 59.2, 63.6, 88.4, 68.7, 89.7, 73.2]
7+
8+
# ap es el array de pesos y alturas
9+
ap = np.array([ alturas, pesos ])
10+
print("original: \n", ap, "\n")
11+
12+
# 0 1 2 3 4 5 6 <--- Columnas
13+
# [[ 1.73 1.68 1.71 1.89 1.79 1.76 1.67]] --- Fila 0
14+
# [[65.4 59.2 63.6 88.4 68.7 89.7 73.2 ]]] --- Fila 1
15+
16+
17+
# obtengo los indices ordenados usando argsort()
18+
indices_ordenados_alturas = ap[0,:].argsort()
19+
indices_ordenados_pesos = ap[1,:].argsort()
20+
print("Alturas ordenadas (indices): \n", indices_ordenados_alturas )
21+
print("Pesos ordenados (indices): \n", indices_ordenados_pesos )
22+
23+
# ahora ordenamos el array usando estos indices ordenados
24+
# por altura
25+
personas_ordenadas_por_altura = ap[ :, indices_ordenados_alturas ]
26+
print("Ordenadas por altura:\n", personas_ordenadas_por_altura)
27+
28+
# por peso
29+
personas_ordenadas_por_peso = ap[ :, indices_ordenados_pesos ]
30+
# == ap[ :, ap[1,:].argsort() ]
31+
# == ap[ :, np.argsort(ap[1,:]) ]
32+
print("Ordenadas por peso:\n", personas_ordenadas_por_peso)

Exercises/Weeks/Week06/1_ones_zeros.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
import numpy as np
88

9-
a = np.ones((3, 3))
10-
b = np.zeros((256, 256))
9+
a = np.ones((3, 3), dtype=int)
10+
b = np.zeros((256, 256), dtype=int)
1111

1212
print(a.itemsize) # 8 bytes
1313
print(a.size) # 3 x 3 = 9 elements

Exercises/Weeks/Week06/2_ndarrays.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@
1212
# [ True True True]
1313
# [ True True True]]
1414

15-
c = np.array(a[a%2!=0]) # [1 3 5 7 9]
15+
b2 = np.ones((3, 3), dtype=bool) # Al ser tipo bool, muestra los 1 como True y los 0 como False
1616

17-
d = np.where(a%2!=0, -1, a) # [ 0 -1 2 -1 4 -1 6 -1 8 -1]
17+
c = np.array( a[a % 2 != 0] ) # [1 3 5 7 9]
18+
19+
d = np.where(a % 2 != 0, -1, a) # [ 0 -1 2 -1 4 -1 6 -1 8 -1]
20+
d2 = a[a % 2 == 1] = -1
1821

1922
e = np.reshape(a, (2, 5)) # [[0 1 2 3 4]
20-
# [5 6 7 8 9]]
23+
# [5 6 7 8 9]]
24+
25+
e2 = np.reshape(arr_a, (2, -1)) # Cambiamos la forma del array. (2,-1) es el nuevo tamaño que se le quiere dar.
26+
# El primer número de la tupla (2) pide que el primer eje tenga dos elementos.
27+
# El segundo número de la tupla (-1) indica que numpy calcule el tamaño del segundo eje, teniendo en cuenta el tamaño original de arra_a

Exercises/Weeks/Week06/3_dtypes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,9 @@
2121
print(c.itemsize) # 4
2222
print(d.itemsize) # 8
2323

24+
# Leo cuanto ocupan en la memoria y lo paso a kilobytes
25+
print("===> Memoria")
26+
print("a %d kilobytes" % ((a.size * a.itemsize) / 1024))
27+
print("b %d kilobytes" % ((b.size * b.itemsize) / 1024))
28+
print("c %d kilobytes" % ((c.size * c.itemsize) / 1024))
29+
print("d %d kilobytes" % ((d.size * d.itemsize) / 1024))

Exercises/Weeks/Week06/4_tablas_multiplicar.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,8 @@ def mult_table(n):
2121
# [ 9]
2222
# [10]]
2323

24-
print(mult_table(10))
24+
print(mult_table(10))
25+
26+
def tabla():
27+
tablas = np.array([np.arange(1,11)] * 10) # Generamos un array que va del 1 al 10, la transformamos en lista con la operación * concatenamos la misma lista 10 veces
28+
tablas = np.transpose(tablas) * tablas[0,:] # Transponemos dicho array y usando la operación * entre arrays que multiplica cada columna de tablas por tablas[0,:]

Exercises/Weeks/Week06/9_estimar_pi.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,23 @@
22
# La idea consiste en generar puntos al azar (todos con valores de x e y ubicados entre 0 y 1), y ver cuántos de ellos están contenidos dentro del círculo de radio 1 alrededor del punto central (0, 0).
33
# a) Usando la función de Numpy numpy.random.rand(), generá un array de números al azar de tamaño (10000, 2), que representa 10000 puntos generados al azar.
44
# b) Usando el array del inciso anterior, contá la cantidad de puntos que caen dentro del cículo (es decir, contá cuántos cumplen que x**2 + y**2 < 1). Luego estimá el valor de π dividiendo ese valor por la cantidad de puntos (o sea, en este caso 10000), y multiplicando el resultado por 4. ¿Dió similar al valor conocido de π?
5-
# c) Creá una función estimar_pi(n) que devuelva una estimación del valor de π como la que hiciste antes pero usando n puntos, donde n es el parámetro de entrada.
5+
# c) Creá una función estimar_pi(n) que devuelva una estimación del valor de π como la que hiciste antes pero usando n puntos, donde n es el parámetro de entrada.
6+
7+
import numpy as np
8+
puntos = np.random.rand(10000, 2) # a. array numeros al azar
9+
10+
cantidad = np.count_nonzero(puntos[:,0]**2 + puntos[:,1]**2 < 1) # b. cuántos cumplen que x**2 + y**2 < 1
11+
print('La estimación de Pi dio:', cantidad*4/10000)
12+
13+
# es igual que:
14+
# cantidad = 0
15+
# for punto in puntos:
16+
# if punto[0]**2 + punto[1]**2 < 1:
17+
# cantidad += 1
18+
19+
def estimar_pi(n): # c. estimar pi con n puntos
20+
puntos = np.random.rand(n, 2)
21+
cantidad = np.count_nonzero(puntos[:, 0] ** 2 + puntos[:, 1] ** 2 < 1)
22+
23+
return cantidad * 4 / n
24+
print(estimar_pi(10000000))

0 commit comments

Comments
 (0)