- Aprender
- Informática
- Ciencia de datos e IA
- Análisis de datos con Python
- Arreglos de NumPy
Arreglos de NumPy y computación vectorizada
IntermedioUnidad 1 de 8 del curso Curso de Análisis de datos con Python
Lo que aprenderás
- Crea arreglos de NumPy a partir de datos de Python y con las funciones de creación de NumPy, describe un arreglo por su forma y su tipo de datos, y elige y convierte tipos de datos sin perder información por accidente.
- Explica qué es un arreglo de NumPy y en qué se diferencia de una listaDescribe un arreglo por sus dimensiones, forma, tamaño y tipo de datos, y explica por qué los arreglos se comportan y rinden de forma distinta a las listas de Python.
- Crea arreglos a partir de listas y con las funciones de creación de NumPyConvierte listas en arreglos y genera arreglos rellenos, rangos de números y cuadrículas de valores uniformemente espaciados con la forma y el tipo que necesitas.
- Elige, inspecciona y convierte tipos de datosConsulta y establece el tipo de datos de un arreglo, predice el tipo que elige NumPy y convierte entre tipos evitando truncamientos, desbordamientos y pérdidas de valores faltantes.
- Explica qué es un arreglo de NumPy y en qué se diferencia de una lista
- Selecciona valores individuales, filas, columnas y bloques; selecciona mediante listas de posiciones o condiciones; y determina cuándo una selección comparte sus datos con el arreglo original.
- Selecciona elementos y segmentos de arreglos de una y dos dimensionesUtiliza posiciones y segmentos, uno por eje, para leer y modificar elementos, filas, columnas y bloques.
- Selecciona mediante listas de posiciones y distingue las vistas de las copiasSelecciona elementos, filas o columnas con arreglos de enteros y predice si un resultado comparte memoria con el arreglo original.
- Filtra mediante condiciones con máscaras booleanas y np.whereCrea máscaras de verdadero o falso a partir de comparaciones, combínalas y utilízalas para filtrar, contar, sustituir y elegir valores.
- Selecciona elementos y segmentos de arreglos de una y dos dimensiones
- Reorganiza los mismos valores con una forma nueva, intercambia filas y columnas, añade o elimina ejes de longitud 1 y une o divide arreglos a lo largo de un eje.
- Cambia la forma de un arreglo e intercambia sus ejesCambia la forma de los arreglos, aplánalos y transpónlos, y añade o elimina ejes de longitud 1, prediciendo el orden de los valores.
- Une y divide arreglosCombina arreglos a lo largo de un eje existente o de uno nuevo y divide un arreglo en partes, comprobando que las formas sean compatibles.
- Cambia la forma de un arreglo e intercambia sus ejes
- Escribe cálculos sobre arreglos completos en lugar de bucles elemento a elemento, aplica las funciones universales de NumPy y combina arreglos de distintas formas mediante las reglas de difusión.
- Calcula elemento a elemento en lugar de usar buclesUtiliza operadores aritméticos y de comparación sobre arreglos completos y comprende cómo tratan las formas, la división por cero y las actualizaciones in situ.
- Aplica funciones universales a arreglos completosUtiliza las funciones matemáticas de NumPy elemento a elemento, incluidas las de redondeo y las que operan con dos arreglos, y trata los valores fuera del dominio de una función.
- Combina arreglos de distintas formas mediante difusiónAplica las reglas de difusión para predecir si dos formas se pueden combinar y cuál será la forma resultante, y corrige errores de forma añadiendo un eje.
- Calcula elemento a elemento en lugar de usar bucles
- Reduce arreglos a totales, medias, extremos, medidas de dispersión, medianas y recuentos, para el arreglo completo o a lo largo de un eje elegido, y trata correctamente los valores faltantes y los subconjuntos.
- Agrega los valores de un arreglo completo o a lo largo de un ejeCalcula sumas, medias, extremos, posiciones, sumas acumuladas y medidas de dispersión para el arreglo completo o por fila o columna, y predice la forma del resultado.
- Utiliza medianas, percentiles, ordenación y valores distintosDescribe el centro y la dispersión de los datos con estadísticos basados en el orden, ordena valores y arreglos relacionados, y cuenta los valores distintos.
- Resume datos con valores faltantes y condicionesDetecta, cuenta, elimina y rellena valores faltantes, utiliza agregaciones que omiten valores NaN y resume solo los valores que cumplen una condición o pertenecen a un grupo.
- Agrega los valores de un arreglo completo o a lo largo de un eje
- Crea un generador de números aleatorios con semilla, obtén muestras reproducibles de distribuciones habituales, mezcla datos y toma muestras, y estima resultados mediante simulaciones vectorizadas.
- Obtén muestras aleatorias reproducibles con un GeneratorCrea un Generator con una semilla, obtén enteros, decimales, valores normales y muestras de una lista, mezcla datos y mantén los resultados reproducibles.
- Ejecuta simulaciones vectorizadasEstima probabilidades y comportamientos a largo plazo obteniendo todos los valores aleatorios a la vez y resumiéndolos mediante operaciones con arreglos.
- Obtén muestras aleatorias reproducibles con un Generator
Guía de estudio de Arreglos de NumPy
1Crea arreglos y controla sus tipos de datos
Es más fácil trabajar con datos numéricos cuando su estructura y su tipo de almacenamiento están claros. Crea arreglos a partir de valores existentes o de una forma prevista y después consulta sus dimensiones, número de elementos y tipo de datos. Elige funciones de creación adecuadas para tus datos y observa cómo la conversión, el redondeo, el desbordamiento y los valores faltantes afectan a lo que almacena el arreglo. Estas decisiones determinan si los cálculos posteriores conservan la información que necesitas.
1.1 Explica qué es un arreglo de NumPy y en qué se diferencia de una lista
NumPy almacena datos numéricos en arreglos para que una expresión pueda operar sobre muchos valores. Impórtalo con import numpy as np; el nombre corto np es la forma habitual de llamar a sus funciones.
Interpreta la estructura de un arreglo
Un arreglo multidimensional es una cuadrícula rectangular cuyos elementos comparten un mismo tipo de datos. Una dimensión también se llama eje. Comienza con una tabla pequeña:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
Sus atributos responden a cuatro preguntas distintas:
| Atributo | Significado | Valor para a |
|---|---|---|
ndim | Número de ejes | 2 |
shape | Longitud de cada eje | (2, 3) |
size | Total de elementos | 6 |
dtype | Tipo de cada elemento | Normalmente int64 en una computadora de 64 bits |
El eje 0 indexa las filas; el eje 1 indexa las columnas. Una tabla de datos con una fila por persona y columnas de altura, masa y edad tendría la forma (100, 3) para 100 personas. El producto de las dimensiones de la forma da el tamaño.
Un vector no tiene eje de filas ni de columnas
np.array([2, 4, 6, 8]) tiene forma (4,) y un eje. La coma indica que es una tupla de un solo elemento. La forma (1, 4) tiene dos ejes: una fila y cuatro columnas. La forma (4, 1) también tiene dos ejes, pero cuatro filas y una columna. Estos arreglos contienen cuatro valores, pero se comportan de forma distinta al combinarlos con otros arreglos. np.array(7) es un arreglo de dimensión cero: su forma es () y su ndim es 0.
Los arreglos cambian el significado de los operadores
Una lista es un contenedor de uso general de Python. Un arreglo está diseñado para realizar cálculos en posiciones correspondientes.
| Expresión | Resultado |
|---|---|
[1, 2, 3] * 2 | [1, 2, 3, 1, 2, 3] |
np.array([1, 2, 3]) * 2 | array([2, 4, 6]) |
[1, 2] + [3, 4] | [1, 2, 3, 4] |
np.array([1, 2]) + np.array([3, 4]) | array([4, 6]) |
En la suma de arreglos, 1 se empareja con 3 y 2 se empareja con 4. El arreglo mantiene el mismo tamaño.
Por qué son eficientes los arreglos numéricos
Un arreglo numérico recién creado almacena juntos en memoria valores del mismo tipo. NumPy ejecuta el bucle sobre estos valores en código compilado y evita una operación independiente al nivel de Python para cada número. Un millón de valores float64 ocupa 8 000 000 de bytes de almacenamiento de elementos, que se pueden consultar como a.nbytes en un arreglo de ese tamaño. Una lista de Python también almacena referencias a objetos de Python, por lo que necesita bastante más espacio. Las mejoras de rendimiento dependen del cálculo y de la computadora.
El tamaño de un arreglo no aumenta mediante un método append in situ. np.append(a, value) reserva un arreglo nuevo. Para datos recogidos un valor a la vez, crea una lista de Python y conviértela una sola vez. Los datos de entrada anidados deben ser rectangulares: np.array([[1, 2], [3]]) genera ValueError porque las longitudes de sus filas son distintas.
Reconoce los resultados mostrados
print(np.array([1, 2, 3])) muestra [1 2 3]. Una visualización interactiva usa array([1, 2, 3]). Para np.array([5, 6])[0] en una computadora de 64 bits, NumPy 2 muestra np.int64(5); este valor participa en operaciones aritméticas como el número 5.
Puntos clave
- La forma indica la longitud de cada eje; el tamaño cuenta todos los elementos.
- Una forma de 1 dimensión como
(4,)es distinta de una fila o columna de 2 dimensiones. - La aritmética con arreglos opera sobre valores en posiciones correspondientes.
- Los arreglos numéricos almacenan un solo tipo de datos y permiten cálculos compilados eficientes.
- Los datos de entrada anidados deben tener filas de igual longitud.
1.2 Crea arreglos a partir de listas y con las funciones de creación de NumPy
Elige una función de creación preguntándote qué conoces: los valores concretos, una forma y un valor de relleno, un paso o un número de puntos necesario. Esa elección permite que el código exprese cómo deben construirse los datos.
Parte de valores o de una forma
np.array([3, 1, 4]) crea un vector. Una lista de listas de igual longitud crea una tabla. Pasa los valores como una sola secuencia; np.array(1, 2, 3) no proporciona correctamente tres elementos.
| Función | Ejemplo | Qué crea |
|---|---|---|
np.zeros | np.zeros((3, 4)) | Tres filas de cuatro ceros |
np.ones | np.ones((2, 3)) | Dos filas de tres unos |
np.full | np.full((2, 2), 7) | Un arreglo de 2 por 2 relleno con 7 |
np.empty | np.empty((3, 4)) | Almacenamiento reservado y sin inicializar |
Para una forma multidimensional, los paréntesis importan. np.zeros((2, 3)) pasa una sola tupla. En np.zeros(2, 3), Python envía 3 como argumento del tipo de datos, lo que provoca un error de tipo. Los ceros y unos usan float64 de forma predeterminada; full infiere su tipo de datos a partir del valor de relleno. Añade dtype=int cuando necesites almacenar números enteros.
empty no garantiza ceros ni valores iniciales significativos. Lee sus valores solo después de asignar todos los elementos que vayas a utilizar. zeros es una opción más sencilla cuando un cero inicial tiene significado.
Elige un paso o un número de puntos
np.arange(start, stop, step) sigue la idea de los pasos de range de Python. np.arange(2, 11, 3) da [2 5 8]: comienza en 2 y suma 3 mientras permanezca por debajo de 11. Con un argumento, np.arange(5) comienza en 0 y da [0 1 2 3 4].
Los pasos de coma flotante pueden producir extremos inesperados. Por ejemplo, np.arange(1, 1.3, 0.1) incluye el valor mostrado 1,3 porque el redondeo binario afecta al cálculo de la secuencia. Para una cuadrícula decimal con un número fijo de puntos, utiliza linspace:
grid = np.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])
Ambos extremos se incluyen de forma predeterminada. Cinco puntos forman cuatro intervalos. Diez puntos entre 0 y 1 forman nueve intervalos, por lo que su espaciado es aproximadamente 0,111; los pasos de 0,1 necesitan 11 puntos.
Reutiliza una estructura existente
np.zeros_like(a), np.ones_like(a) y np.full_like(a, value) crean arreglos nuevos con la forma y el tipo de datos de a. El tipo heredado importa: rellenar una plantilla de enteros con un decimal puede hacer que se pierda la parte decimal, salvo que solicites un tipo de coma flotante. np.eye(3) crea una matriz identidad cuadrada con unos en la diagonal y ceros en las demás posiciones.
Reserva una tabla de datos una sola vez
Para la lluvia en milímetros en tres estaciones durante cuatro semanas:
rain = np.zeros((3, 4))
rain[0] = [12.0, 0.0, 5.5, 8.0]
La primera asignación rellena una fila y conserva la forma (3, 4). Si se conoce el número de mediciones, reservar la tabla completa evita reservar repetidamente arreglos más grandes. Si se desconoce la cantidad de datos de entrada, acumula los valores en una lista y llama a np.array cuando termine la recogida.
Puntos clave
- Pasa una forma multidimensional como una tupla.
arangeespecifica un paso;linspaceespecifica un número de puntos.linspaceincluye ambos extremos de forma predeterminada.emptydebe rellenarse antes de utilizar sus valores.- Las funciones like heredan tanto la forma como el tipo de datos.
- Reserva una sola vez una forma final conocida.
1.3 Elige, inspecciona y convierte tipos de datos
El tipo de datos de un arreglo controla qué puede almacenar y cuánta memoria necesita cada valor. Elegir el tipo adecuado también evita que los cálculos pierdan información sin aviso.
Inspecciona el tipo de almacenamiento
int64 almacena números enteros de 64 bits, float64 almacena números binarios de coma flotante y bool almacena valores de verdadero o falso. Los tipos Unicode como <U5 almacenan texto con una longitud máxima de caracteres. a.itemsize son los bytes por elemento; a.nbytes es a.size * a.itemsize. Un float64 usa 8 bytes y tiene una precisión de unas 15 cifras decimales significativas.
En las computadoras típicas de 64 bits, los datos enteros utilizan enteros de 64 bits. NumPy 2 también usa ese valor predeterminado en Windows de 64 bits. Los datos decimales normalmente dan float64.
La inferencia elige un tipo compartido
np.array([1, 2.5]) se convierte en [1. 2.5]: el entero se representa como un número de coma flotante. np.array([True, 2]) se convierte en [1 2]. Mezclar números y texto puede convertir todo el arreglo en texto, por lo que una etiqueta como 'n/a' puede hacer que fallen las operaciones aritméticas posteriores. Inspecciona dtype cuando unos datos aparentemente numéricos no se puedan sumar o multiplicar.
Convierte de forma deliberada
astype devuelve una copia convertida:
x = np.array([1.7, -1.7, 2.5])
whole = x.astype(int)
# array([ 1, -1, 2])
Esta conversión trunca hacia cero; no redondea. np.round(x).astype(int) da [2 -2 2] porque los valores exactamente a mitad de camino se redondean al valor par más cercano. Un texto como '1.5' se convierte con astype(float), pero 'n/a' genera ValueError. Limpia los marcadores antes de la conversión.
Las asignaciones usan el tipo de datos del destino. Después de a = np.array([1, 2, 3]), asignar a[0] = 9.9 almacena 9 sin advertencia. Convertir primero todo el arreglo a coma flotante permite que las asignaciones posteriores conserven los decimales.
Los enteros de ancho fijo pueden desbordarse
Un int8 almacena valores de −128 a 127; un uint8 almacena de 0 a 255. Sumar dos arreglos uint8 que contienen 250 y 10 produce 4 al volver al otro extremo del intervalo. Multiplicar por 2 un arreglo int8 que contiene 100 produce −56. En cambio, un entero de Python que no cabe en el tipo del arreglo, como 300 sumado a un arreglo int8 en NumPy 2, genera OverflowError. Amplía los tipos enteros pequeños antes de realizar cálculos que puedan superar su intervalo.
División y decimales aproximados
| Operación | Ejemplo | Resultado |
|---|---|---|
| División verdadera | np.array([7, 8]) / 2 | [3.5 4.] |
| División por suelo | np.array([7, -7]) // 2 | [3 -4] |
| Resto | np.array([7, -7]) % 2 | [1 1] |
La división por suelo redondea hacia abajo, en dirección al infinito negativo, lo que difiere del truncamiento para resultados negativos. La división verdadera devuelve resultados de coma flotante para entradas enteras.
Muchas fracciones decimales son aproximaciones en binario. 0.1 + 0.2 == 0.3 es falso; np.isclose compara valores correspondientes con una tolerancia y np.allclose da una respuesta para el arreglo completo.
El marcador de valor faltante np.nan es de coma flotante. Los arreglos de enteros no pueden almacenarlo. Por tanto, np.array([1, 2, np.nan]) se convierte en un arreglo de coma flotante; convertir valores faltantes a enteros no los corrige y puede producir resultados sin significado.
Puntos clave
- Un tipo de datos rige todos los elementos, incluidos los valores asignados después.
astype(int)trunca hacia cero; el redondeo es un paso aparte.- Los enteros pequeños de ancho fijo pueden desbordarse durante las operaciones aritméticas.
- Utiliza comparaciones con tolerancia para decimales aproximados.
- NaN necesita un tipo de datos de coma flotante.
2Selecciona y filtra datos en arreglos
Un análisis pocas veces necesita todos los valores exactamente en su orden original. Selecciona posiciones individuales, segmentos regulares, registros arbitrarios o elementos que cumplan una condición. Comprueba si un resultado comparte memoria con su origen antes de editarlo. Las máscaras booleanas permiten después usar la misma regla de selección para filtrar, sustituir, contar y calcular proporciones, conservando registros completos cuando tu pregunta lo requiera.
2.1 Selecciona elementos y segmentos de arreglos de una y dos dimensiones
La indexación localiza valores por posición. La selección de segmentos elige una secuencia regular de posiciones. En una tabla, escribe un selector para cada eje, de modo que el código indique tanto las filas como las columnas que necesitas.
Lee un vector
Para a = np.array([10, 20, 30, 40, 50]), la posición 0 contiene 10 y la posición −1 contiene 50. Un segmento tiene la forma start:stop:step, con el extremo final excluido:
| Selección | Resultado |
|---|---|
a[1:4] | [20 30 40] |
a[::2] | [10 30 50] |
a[::-1] | [50 40 30 20 10] |
a[3:10] | [40 50] |
Omitir el inicio o el final extiende el segmento hasta el extremo correspondiente. Un segmento puede sobrepasar el arreglo y recortarse automáticamente. Una posición individual no válida, como a[5], genera IndexError.
Asigna a cada eje de la tabla su propio selector
m = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
m[1, 2] lee la fila 1, columna 2, y da 6. La coma separa los ejes. Dos puntos por sí solos seleccionan el eje completo: m[0, :] da la primera fila [1 2 3], y m[:, 1] da la segunda columna [2 5 8]. Para obtener un bloque, m[:2, 1:] selecciona las filas 0 y 1 y las columnas 1 y 2, y da [[2 3] [5 6]].
No consideres intercambiables la indexación con corchetes repetidos y la indexación con comas. m[1][2] localiza el mismo escalar que m[1, 2]. Pero m[:][0] toma primero todas las filas y después selecciona la primera fila. No selecciona la primera columna, que es m[:, 0].
Predice qué ejes permanecen
Un selector entero individual elimina su eje. Un segmento conserva su eje incluso cuando solo se selecciona una posición. Por tanto, m[:, 1] tiene forma (3,), mientras que m[:, 1:2] tiene forma (3, 1). Ambos seleccionan 2, 5 y 8, pero solo el segundo conserva un eje de columna. Esta diferencia importa al restar o multiplicar arreglos con otras formas.
La misma regla se extiende más allá de las tablas. Si t.shape es (2, 3, 4), t[0] tiene forma (3, 4), t[0, 1] tiene forma (4,) y t[:, :, 0] tiene forma (2, 3). Los ejes finales omitidos en el índice se seleccionan por completo.
Modifica las posiciones seleccionadas
La asignación mediante un índice escribe en el arreglo existente. a[1:3] = 0 sustituye ambos valores seleccionados por cero; el escalar se aplica a toda la selección. m[0] = [0, 0, 0] sustituye una fila completa. Los valores asignados deben ajustarse a la forma de la selección y se convierten a su tipo de datos.
Para cuatro estudiantes y tres pruebas:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[2] es el resultado [88 91 95] del tercer estudiante. scores[:, -1] da los resultados de la última prueba [92 58 95 80]. scores[1:3, :2] da [[64 70] [88 91]]: dos estudiantes, cada uno con dos columnas de pruebas.
Puntos clave
- Los índices empiezan en 0; los índices negativos cuentan desde el final.
- Los segmentos excluyen el extremo final y pueden recortarse en el límite de un arreglo.
- Utiliza selectores separados por comas para ejes distintos.
- Un entero elimina un eje; un segmento lo conserva.
- La asignación mediante un índice modifica los valores seleccionados.
2.2 Selecciona mediante listas de posiciones y distingue las vistas de las copias
Una selección puede compartir sus datos con el arreglo original o tener datos independientes. Saber cuál de las dos tienes evita que las modificaciones de una selección pequeña cambien inesperadamente una tabla más grande.
Distingue una referencia compartida, una vista y una copia
| Código | Relación | Efecto de modificar b |
|---|---|---|
b = a | Dos nombres para un objeto | Modifica a |
b = a[2:5] | Una vista de un segmento que comparte datos | Modifica la parte correspondiente de a |
b = a[2:5].copy() | Datos independientes | Deja a sin cambios |
Para a = np.arange(6) y b = a[2:5], asignar b[0] = 99 hace que a sea igual a [0 1 99 3 4 5]. La primera posición de la vista se refiere a la posición 2 del original. Esto difiere de seleccionar un segmento de una lista de Python, que crea una lista nueva.
Copia antes de editar cuando el original deba permanecer intacto. Una vista pequeña que se conserva también puede mantener en memoria un bloque grande de datos originales; copiar esa pequeña parte permite que sea independiente.
Selecciona posiciones arbitrarias
La indexación avanzada utiliza una lista o un arreglo de enteros. Permite reordenar y repetir posiciones:
a = np.array([10, 20, 30, 40, 50])
a[[4, 0, 0]]
# array([50, 10, 10])
Para m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), m[[0, 2]] selecciona la primera y la tercera fila. m[:, [2, 0]] selecciona la última y la primera columna en ese orden, y da [[3 1] [6 4] [9 7]].
Dos listas de enteros en un mismo índice seleccionan coordenadas emparejadas. m[[0, 2], [1, 2]] empareja la fila 0 con la columna 1 y la fila 2 con la columna 2, y produce [2 9]. No toma todas las combinaciones. Para obtener el bloque formado por ambas filas y ambas columnas, utiliza:
m[np.ix_([0, 2], [1, 2])]
# array([[2, 3], [8, 9]])
Seleccionar primero las filas y después las columnas, m[[0, 2]][:, [1, 2]], da el mismo bloque.
La lectura y la asignación se comportan de forma distinta
La indexación avanzada y el filtrado booleano devuelven copias. Si c = a[[0, 1]], modificar c[0] deja a sin cambios. Pero a[[0, 1]] = -1 escribe directamente en esas posiciones originales. Una selección guardada y una asignación mediante un índice son operaciones distintas.
Esto también explica por qué las modificaciones encadenadas pueden no llegar al origen. En a[[0, 1]][0] = -1, la primera selección ya es una copia temporal. La escritura final modifica ese arreglo temporal, no a.
Comprueba directamente si se comparte memoria
np.shares_memory(x, y) comprueba si dos arreglos se solapan en memoria. Devuelve verdadero para un segmento ordinario no vacío y falso para una copia obtenida por indexación avanzada. El atributo base puede identificar al propietario de los datos subyacentes, pero no tiene por qué identificar el arreglo del que obtuviste el segmento más reciente. Si a = np.arange(6), b = a[2:5] y c = b[0:2], entonces c.base is a es verdadero y c.base is b es falso. Utiliza shares_memory cuando la pregunta sea específicamente si dos arreglos comparten datos.
Puntos clave
- La asignación crea una referencia compartida a un arreglo; un segmento básico comparte sus datos.
- Utiliza
.copy()para obtener una selección independiente. - La indexación avanzada conserva el orden solicitado y permite repeticiones.
- Dos listas de índices enteros emparejan coordenadas;
np.ix_selecciona todas las combinaciones. - La lectura con indexación avanzada copia, pero las asignaciones directas mediante índices actualizan el origen.
- Utiliza
np.shares_memorypara comprobar si los arreglos comparten memoria.
2.3 Filtra mediante condiciones con máscaras booleanas y np.where
Una máscara booleana registra qué valores cumplen una condición. Una vez creada, las mismas decisiones de verdadero o falso pueden seleccionar valores, contar sucesos o elegir sustituciones.
Crea y aplica una máscara
t = np.array([18.5, 22.0, 15.2, 25.8, 21.1])
warm = t > 20
t[warm]
# array([22. , 25.8, 21.1])
La comparación produce [False True False True True]. La indexación booleana conserva las posiciones verdaderas y devuelve una copia. Una máscara de 1 dimensión utilizada sobre un eje debe tener la misma longitud que ese eje.
Para combinar condiciones, utiliza & para «y», | para «o» y ~ para «no». Pon cada comparación entre paréntesis:
comfortable = (t > 18) & (t < 23)
t[comfortable]
# array([18.5, 22. , 21.1])
and y or de Python intentan obtener un único valor de verdad de todo un arreglo y fallan con arreglos de varios elementos. Omitir los paréntesis también cambia la forma en que Python agrupa la expresión, porque los operadores bit a bit tienen prioridad sobre las comparaciones.
Cuenta, mide o comprueba condiciones
True aporta 1 y False aporta 0. warm.sum() es 3 y warm.mean() es 0,6, la proporción de días por encima de 20 °C. np.count_nonzero(warm) también cuenta las entradas verdaderas. warm.any() pregunta si al menos un día es cálido; warm.all() pregunta si todos los días son cálidos.
Estas operaciones responden a preguntas distintas de t[warm].mean(), que calcula la temperatura media de los días cálidos. La media de una máscara mide una proporción; la media de las mediciones seleccionadas conserva la unidad de la medición.
Sustituye valores o elige entre alternativas
La asignación mediante una máscara actualiza las posiciones seleccionadas. Con t2 = t.copy(), la línea t2[t2 < 16] = 16 eleva las mediciones bajas a 16. np.clip(t, 16, 25) devuelve un arreglo nuevo limitado por ambos extremos, [18.5 22. 16. 25. 21.1].
np.where(condition, x, y) crea un resultado nuevo que toma x en las posiciones verdaderas e y en las falsas. np.where(t > 20, 'warm', 'cool') proporciona una etiqueta en cada posición original. En cambio, el filtrado acorta el resultado. Con una sola condición, np.where(t > 20) devuelve una tupla de arreglos de índices, aquí (array([1, 3, 4]),).
Conserva valores o registros completos
Una máscara de la misma forma aplicada a un arreglo de 2 dimensiones extrae los elementos coincidentes en un único vector plano. En m[m > 5], se pierde la estructura de filas. Para conservar registros completos, obtén un valor booleano por fila a partir de una columna:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[scores[:, 2] >= 90]
# array([[78, 85, 92], [88, 91, 95]])
Detecta explícitamente los valores faltantes
NaN no es igual ni siquiera a sí mismo. Las comparaciones de igualdad y orden con NaN son falsas; la comparación de desigualdad es verdadera. Por tanto, ni x == np.nan ni x != np.nan identifican correctamente las entradas presentes y faltantes. np.isnan(x) marca las posiciones faltantes y x[~np.isnan(x)] conserva los valores presentes.
Puntos clave
- Una máscara contiene una decisión de verdadero o falso por cada posición comprobada.
- Combina comparaciones entre paréntesis con
&,|y~. - La suma de una máscara cuenta las coincidencias; su media da la proporción.
- Utiliza una máscara con la longitud de las filas para filtrar registros completos.
np.whereelige valores en cada posición.- Utiliza
np.isnanpara detectar NaN.
3Cambia la forma de los arreglos, transpónlos y únelos
Una forma útil de un arreglo expresa cómo se agrupan los datos: meses dentro de trimestres, mediciones dentro de registros o lotes dentro de una colección más grande. Reorganiza los valores mediante un cambio de forma, intercambia las funciones de los ejes mediante una transposición y añade ejes de longitud uno cuando un vector deba funcionar como fila o columna. Después, la unión y la división combinan o separan esos grupos, con comprobaciones de forma que mantienen intacta la estructura prevista.
3.1 Cambia la forma de un arreglo e intercambia sus ejes
Cambiar la forma modifica cómo se agrupan los valores en ejes. Cambiar la forma, transponer y añadir un eje cumplen funciones distintas, aunque algunas produzcan la misma forma final.
Cambia la forma sin modificar el número de elementos
a = np.arange(6)
r = a.reshape(2, 3)
# array([[0, 1, 2], [3, 4, 5]])
El orden predeterminado rellena una fila a la vez: el último eje cambia más rápido. Cambiar la forma de los mismos valores a (3, 2) da [[0 1] [2 3] [4 5]]. El producto de las nuevas dimensiones debe ser igual al tamaño original. Doce elementos caben en (3, 4), pero no en (5, 3).
Una dimensión puede ser -1, lo que permite que NumPy infiera su longitud. np.arange(12).reshape(-1, 3) da cuatro filas de tres; reshape(2, -1) da dos filas de seis. No se permiten dos dimensiones desconocidas porque sus longitudes individuales no pueden determinarse solo a partir del total.
La transposición intercambia los ejes
Para el r anterior, r.T es [[0 3] [1 4] [2 5]], con forma (3, 2). Cada columna original es ahora una fila. Esa disposición difiere de r.reshape(3, 2), aunque las formas resultantes coincidan.
| Operación | Qué le ocurre a r |
|---|---|
r.reshape(3, 2) | Lee los valores fila por fila y los reagrupa |
r.T | Intercambia las funciones de filas y columnas |
Una transposición es útil cuando la siguiente operación necesita el orden inverso de los ejes. Un cambio de forma es útil cuando una secuencia ya tiene una agrupación significativa, como meses agrupados en trimestres.
Transponer un arreglo de 1 dimensión no crea una columna
v = np.arange(3) tiene un solo eje, por lo que v.T sigue teniendo forma (3,). Añade un eje explícitamente:
column = v[:, np.newaxis] # shape (3, 1)
row = v[np.newaxis, :] # shape (1, 3)
v.reshape(-1, 1) y np.expand_dims(v, 1) también crean una columna. np.squeeze(column) elimina su eje de longitud uno y devuelve la forma (3,). Añadir un eje no cambia ningún valor, pero indica a las operaciones aritméticas posteriores cómo deben alinearse.
Aplanamiento y memoria compartida
r.ravel() y r.flatten() enumeran los valores en un resultado de 1 dimensión. ravel devuelve una vista cuando es posible; flatten siempre copia. reshape(-1) es otra forma de solicitar una disposición de 1 dimensión, pero que comparta memoria depende de la organización de los datos de entrada. El cambio de forma puede necesitar una copia; la transposición comparte datos en su vista del arreglo. Utiliza .copy() cuando necesites almacenamiento independiente.
Agrupa valores mensuales en trimestres
Para monthly = np.array([120, 135, 150, 160, 155, 170, 180, 175, 165, 150, 140, 130]), monthly.reshape(4, 3) crea cuatro filas trimestrales, cada una con tres meses. Sumar cada fila con .sum(axis=1) da [405 485 520 420]. El primer total es 120 + 135 + 150 = 405. El cambio de forma funciona porque los datos de entrada en orden cronológico ya colocan juntos los meses de cada trimestre.
Puntos clave
- El cambio de forma conserva el número de elementos y sigue el orden por filas de forma predeterminada.
- Se puede inferir una dimensión
-1. - La transposición intercambia las funciones de los ejes y puede diferir de un cambio de forma con el mismo resultado dimensional.
- Utiliza un eje nuevo para convertir un vector en una fila o columna.
flattencopia;ravely el cambio de forma pueden compartir datos.
3.2 Une y divide arreglos
La unión combina valores de varios arreglos. La división corta un arreglo en partes. Primero decide si la operación debe ampliar un eje existente o introducir uno nuevo.
Concatena a lo largo de un eje existente
np.concatenate([a, b], axis=0) une vectores por sus extremos. Unir [1 2] con [3 4 5] da [1 2 3 4 5].
Para dos arreglos, cada uno con forma (2, 3), el eje 0 añade filas y da (4, 3). El eje 1 añade columnas y da (2, 6). Solo el eje de unión puede tener distinta longitud. Por tanto, las formas (2, 3) y (2, 2) pueden unirse a lo largo del eje 1 para obtener (2, 5), pero no pueden unirse a lo largo del eje 0 porque sus números de columnas no coinciden.
Los arreglos deben pasarse juntos como una secuencia, por ejemplo [a, b]. La unión crea un arreglo combinado nuevo y copia los datos de entrada.
Apila a lo largo de un eje nuevo
Para p = np.array([1, 2, 3]) y q = np.array([4, 5, 6]):
| Expresión | Forma | Disposición |
|---|---|---|
np.concatenate([p, q]) | (6,) | Un vector más largo |
np.stack([p, q]) | (2, 3) | Un vector por fila |
np.stack([p, q], axis=1) | (3, 2) | Un vector por columna |
stack requiere formas de entrada iguales y añade un eje. concatenate conserva el número de ejes. Las funciones auxiliares expresan disposiciones habituales: vstack([p, q]) crea filas, hstack([p, q]) une estos datos de 1 dimensión por sus extremos y column_stack([p, q]) crea columnas. El comportamiento de hstack con datos de 1 dimensión explica por qué su nombre no basta para predecir una tabla.
Divide por límites o por número de partes
np.split(np.arange(10), [3, 7]) corta antes de las posiciones 3 y 7, y produce [0 1 2], [3 4 5 6] y [7 8 9]. Las posiciones de corte son límites, no longitudes de las partes.
En cambio, un segundo argumento entero solicita partes iguales: np.split(x, 3) solicita tres partes iguales. Diez elementos no pueden dividirse en tres partes iguales de tamaño entero, por lo que esto genera ValueError. np.array_split(np.arange(10), 3) permite longitudes desiguales y produce 4, 3 y 3. Estas llamadas de división devuelven una colección de arreglos, no un único arreglo con un eje nuevo de apilamiento.
Crea una tabla de mediciones
h = np.array([1.62, 1.75, 1.80]) # meters
w = np.array([55.0, 72.5, 80.0]) # kilograms
data = np.column_stack([h, w])
La forma (3, 2) representa tres personas con altura y masa en las columnas. La expresión data[:, 1] / data[:, 0] ** 2 calcula la masa dividida entre la altura al cuadrado para cada fila, y da aproximadamente 21,0, 23,7 y 24,7 kg/m². Es esencial mantener los dos arreglos de mediciones en el mismo orden de personas.
Si los datos de entrada llegan en lotes, reúne los arreglos de los lotes en una lista de Python y llama a concatenate una sola vez. Volver a unir un arreglo cada vez mayor en cada pasada de un bucle copia repetidamente sus datos existentes.
Puntos clave
- La concatenación amplía un eje; el apilamiento añade uno.
- Para concatenar, las dimensiones que no corresponden al eje de unión deben coincidir.
- Utiliza
column_stackpara convertir vectores correspondientes en columnas de una tabla. - Las posiciones de división son límites; un número entero de partes solicita fragmentos iguales.
array_splitpermite partes de distinta longitud.- Reúne primero los lotes y únelos una sola vez.
4Sustituye los bucles por aritmética vectorizada, funciones universales y difusión
Las expresiones sobre arreglos completos permiten describir operaciones numéricas sin escribir un bucle de Python para cada valor. Comienza con aritmética entre posiciones correspondientes, después aplica las funciones matemáticas de NumPy y combina distintas formas mediante difusión. Examinar las formas explica qué valores se emparejan y cuáles se repiten. Las reglas de conversión de tipos, las entradas no válidas y las advertencias de división también importan cuando una expresión breve realiza muchos cálculos a la vez.
4.1 Calcula elemento a elemento en lugar de usar bucles
La vectorización expresa un cálculo para arreglos completos. NumPy se encarga del trabajo repetido a nivel de elemento en código compilado, por lo que la expresión de Python puede mantenerse cercana al cálculo que quieres realizar.
Convierte un bucle en aritmética entre posiciones correspondientes
prices = np.array([2.50, 4.00, 1.20])
qty = np.array([3, 1, 5])
line_totals = prices * qty
order_total = line_totals.sum()
Los productos son [7.5 4. 6.] y su suma es 17,5. Cada precio se empareja con su propia cantidad. Un bucle de Python que actualiza un total produce el mismo resultado, pero hace que Python procese cada par por separado.
Todos los operadores aritméticos actúan elemento a elemento: +, -, *, /, //, % y **. Un escalar se aplica a cada entrada. 10 - np.array([1, 2, 3]) da [9 8 7]; el orden de los operandos sigue importando. Dos arreglos necesitan formas iguales o formas compatibles para la difusión.
Distingue los productos elemento a elemento de los matriciales
* multiplica las entradas correspondientes. Para A = np.array([[1, 2], [3, 4]]) y B = np.array([[5, 6], [7, 8]]), A * B da [[5 12] [21 32]]. La multiplicación matricial usa @ y daría [[19 22] [43 50]]. Elige * para mediciones emparejadas como precio y cantidad.
Las comparaciones también devuelven una respuesta por posición
a == b produce un arreglo booleano. No pregunta si dos arreglos son iguales como objetos completos. Una sentencia if necesita un solo valor de verdad, por lo que if a == b: falla para resultados de varios elementos. np.array_equal(a, b) comprueba la igualdad exacta de arreglos completos. Para decimales aproximados, np.allclose(a, b) comprueba si coinciden dentro de una tolerancia.
Comprende las advertencias de división
Con la configuración predeterminada de errores de NumPy, la división de números de coma flotante por cero produce una advertencia y valores especiales:
np.array([1.0, -1.0, 0.0]) / 0
# array([ inf, -inf, nan])
np.isfinite identifica los resultados que no son infinitos ni NaN. En cambio, la división entera por suelo entre cero devuelve ceros enteros con una advertencia. Esos ceros parecen finitos, así que inspecciona los denominadores enteros con (d == 0).any() antes de la división por suelo. Una advertencia merece atención aunque el programa continúe.
Decide si actualizas in situ
a += value modifica el almacenamiento existente y conserva su tipo de datos. Si a es un arreglo de enteros, a += 0.5 genera un error de conversión porque el resultado de coma flotante no puede almacenarse según la regla de conversión de esa operación. a = a + 0.5 crea un resultado de coma flotante y vincula a a él. Esto difiere de asignar un decimal a un elemento entero, lo que puede truncarlo sin aviso.
Crea una expresión de varios pasos
Para old = np.array([2.50, 4.00, 8.00]) y new = np.array([3.00, 3.00, 8.00]), (new - old) / old * 100 da [20. -25. 0.]. Primero calcula cada variación, después divídela entre su valor original y, por último, expresa la proporción como porcentaje. Los signos muestran una subida, una bajada y ningún cambio. Los valores originales deben ser distintos de cero para este cálculo porcentual.
Puntos clave
- Los operadores vectorizados calculan sobre arreglos completos elemento a elemento.
*empareja entradas;@realiza un producto matricial.- Las comparaciones de arreglos completos necesitan una función que devuelva un único resultado.
- Comprueba los denominadores y examina las advertencias de división.
- La aritmética in situ conserva el tipo de datos del destino.
4.2 Aplica funciones universales a arreglos completos
Una función universal aplica un cálculo por separado en cada posición de un arreglo. Estas funciones amplían la vectorización más allá de la aritmética ordinaria a raíces, logaritmos, redondeo, comparaciones y otras operaciones numéricas.
Elige una función que opere con arreglos
Las funciones universales unarias aceptan una entrada. np.sqrt(np.array([1, 4, 9])) da [1. 2. 3.] y np.abs(np.array([-2, 3])) da [2 3]. np.exp es la función exponencial, np.log es el logaritmo natural y np.log10 es el logaritmo en base 10. Por ejemplo, np.exp(0) es 1,0 y np.log10(1000) es 3,0.
El módulo math de Python opera con números individuales. math.sqrt(np.array([1, 4])) no puede calcular ambas raíces y genera un error de tipo. Utiliza la versión de NumPy para arreglos numéricos. Los operadores también llaman a funciones universales: a + b corresponde a np.add(a, b) y a * b a np.multiply(a, b).
Compara valores correspondientes o reduce un arreglo completo
Las funciones universales binarias aceptan dos entradas. np.maximum([1, 5, 3], [4, 2, 6]) da [4 5 6], eligiendo el valor mayor en cada posición. np.minimum elige el menor y np.power eleva las bases correspondientes a potencias.
np.maximum(x, 0) establece las entradas negativas en cero en un resultado nuevo. Es distinta de np.max(x), una agregación que devuelve un único valor máximo. Para [1, 5, 3], max da 5; maximum necesita otra entrada y conserva la estructura elemento a elemento.
Redondea con la regla prevista
| Función | Regla | Resultado para −2,5 |
|---|---|---|
np.floor | Hacia abajo, en dirección al infinito negativo | −3,0 |
np.ceil | Hacia arriba, en dirección al infinito positivo | −2,0 |
np.trunc | Hacia cero | −2,0 |
np.round | Al más cercano; las mitades exactas al par | −2,0 |
np.round(x, 2) conserva dos decimales. Las mitades exactas siguen la regla del par: np.round([0.5, 1.5, 2.5]) da [0. 2. 2.]. La aproximación binaria puede afectar a los valores que parecen estar exactamente a mitad de camino en decimal, así que interpreta los decimales mostrados teniendo en cuenta su representación en coma flotante.
Inspecciona los valores fuera del dominio de una función
Para entradas reales de coma flotante, np.sqrt(-1.0) devuelve NaN con una advertencia, mientras que np.log(0.0) devuelve infinito negativo con una advertencia bajo la configuración predeterminada de errores. A diferencia de math.sqrt(-1), estas llamadas normalmente no se detienen con una excepción de dominio. Comprueba las entradas cuando la operación matemática requiera un intervalo restringido. np.isnan marca NaN; np.isfinite marca los valores que no son NaN ni infinitos; np.isclose compara valores con una tolerancia.
Combina funciones universales en un cálculo útil
Para los arreglos de coordenadas x = np.array([3, 5, 8]) e y = np.array([4, 12, 15]), calcula la distancia al origen con np.sqrt(x ** 2 + y ** 2). Al elevar al cuadrado se obtiene [9 25 64] y [16 144 225]; al sumar se obtiene [25 169 289]; las raíces son [5. 13. 17.]. np.hypot(x, y) calcula esas distancias directamente.
Puntos clave
- Las funciones universales realizan operaciones numéricas en cada posición.
- Utiliza funciones de NumPy para arreglos, incluidas raíces y logaritmos.
maximumcompara posiciones;maxreduce valores.- Las funciones suelo y techo, el truncamiento y el redondeo utilizan reglas distintas.
- Inspecciona NaN e infinito después de operaciones no válidas con valores reales.
4.3 Combina arreglos de distintas formas mediante difusión
La difusión permite que arreglos de distintas formas participen en cálculos elemento a elemento. Los ejes alineados determinan qué valores se emparejan y cuáles se repiten.
Compara las dimensiones desde la derecha
Alinea las formas por sus extremos derechos. Cada par de longitudes de eje debe ser igual o tener una longitud igual a 1. Los ejes iniciales que faltan cuentan como longitud 1. Un eje de longitud uno se expande conceptualmente para ajustarse a la otra longitud; NumPy no necesita copiar los valores de entrada repetidos.
Para (4, 3) y (3,), las últimas longitudes coinciden en 3. La dimensión inicial que falta actúa como 1 y se expande hasta 4. El resultado es (4, 3): el vector se aplica a cada fila. (4, 3) y (4,) fallan porque las longitudes finales 3 y 4 no coinciden y ninguna es 1. Un par incompatible genera ValueError.
Centra o estandariza columnas
X = np.array([[1, 10], [2, 20], [3, 30]])
centered = X - X.mean(axis=0)
Las medias de las columnas son [2. 20.], con forma (2,). Se alinean con el último eje de (3, 2) y dan [[-1. -10.] [0. 0.] [1. 10.]]. Dividir el resultado centrado por X.std(axis=0) estandariza cada columna y produce aproximadamente −1,22, 0 y 1,22 a lo largo de ambas columnas. La dispersión de cada columna debe ser distinta de cero para esta división.
Conserva un eje para los cálculos por fila
Utiliza una tabla de calificaciones con cuatro estudiantes y tres pruebas:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores.mean(axis=1) tiene forma (4,). No puede difundirse como una media por fila frente a (4, 3). Conserva el eje eliminado:
row_mean = scores.mean(axis=1, keepdims=True)
centered = scores - row_mean
row_mean ahora tiene forma (4, 1). Su 4 inicial coincide con las filas; su 1 final se expande a lo largo de tres columnas. scores.mean(axis=1)[:, np.newaxis] crea la misma forma. Para la fila [78, 85, 92], restar su media de 85 da [-7. 0. 7.].
Usa la misma regla para crear una tabla
np.arange(1, 4)[:, np.newaxis] * np.arange(1, 5) combina (3, 1) y (4,). Ambos arreglos se expanden hasta la forma resultante (3, 4), y producen [[1 2 3 4] [2 4 6 8] [3 6 9 12]].
La expansión también puede ser accidental. Una columna (3, 1) menos un vector (3,) crea las nueve diferencias por pares, con forma (3, 3). Si querías tres diferencias correspondientes, haz que ambas entradas tengan forma (3,), por ejemplo con column.ravel().
Pondera cada columna antes de sumar
Para la misma tabla de calificaciones y w = np.array([0.2, 0.3, 0.5]), scores * w aplica las tres ponderaciones a cada fila. Sumar con .sum(axis=1) da [87.1 62.8 92.4 74.8]. El primer resultado es 15,6 + 25,5 + 46,0 = 87,1.
Puntos clave
- Alinea las formas desde la derecha; las longitudes emparejadas deben coincidir o incluir un 1.
- Un eje de longitud uno controla la dirección de la expansión.
- Los resúmenes por columna normalmente se alinean directamente con una tabla.
- Conserva los resúmenes por fila con forma de columna mediante
keepdims=True. - La difusión puede crear una tabla de pares no deseada.
- Pondera las columnas antes de reducir cada fila.
5Resume arreglos mediante agregaciones a lo largo de sus ejes
Una tabla puede producir un total general, un resumen por registro o un resumen por variable. Decide qué eje reducir y después elige un estadístico que responda a tu pregunta. Las posiciones, las sumas acumuladas y los rangos ordenados ofrecen distintas perspectivas de los datos. Los valores faltantes y las condiciones requieren decisiones propias, porque filtrar o rellenar puede cambiar tanto las observaciones que contribuyen como el significado del resultado.
5.1 Agrega los valores de un arreglo completo o a lo largo de un eje
Una agregación combina valores en menos resultados: un total, una media, un extremo o una medida de dispersión. Elegir el eje forma parte de elegir la pregunta, porque determina qué grupos de valores se combinan.
Reduce el eje que indiques
Para una tabla (4, 3) con cuatro estudiantes y tres pruebas, una agregación sin axis utiliza los 12 valores. scores.sum() da un total. scores.mean(axis=0) reduce el eje de estudiantes y deja tres medias de pruebas. scores.mean(axis=1) reduce el eje de pruebas y deja cuatro medias de estudiantes.
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
Su suma total es 941. Las medias de las columnas son [75.5 78.5 81.25]; las medias de las filas son aproximadamente [85. 64. 91.33 73.33]. Pregúntate qué eje debe desaparecer. Decir «el eje 0 significa cada fila» invierte la operación: el eje 0 combina filas.
Elige la magnitud que se devolverá
| Operación | Tipo de resultado |
|---|---|
sum, prod | Total o producto |
mean | Media aritmética |
min, max | Valor extremo |
argmin, argmax | Posición de un extremo |
std, var | Desviación estándar o varianza |
Los métodos como a.sum() y las funciones como np.sum(a) expresan la misma operación básica. Los métodos de NumPy evitan el comportamiento diferente de las funciones incorporadas de Python. Por ejemplo, sum(scores) de Python suma los arreglos de las filas para producir los totales de las columnas, mientras que scores.sum() combina todas las entradas. max(scores) de Python intenta comparar filas y genera un error de valor de verdad ambiguo.
Las posiciones son distintas de los valores
scores.mean(axis=1).argmax() es 2: el tercer estudiante tiene la media más alta. argmax devuelve la primera posición cuando hay varios máximos iguales. Sin un eje en una tabla, devuelve un índice aplanado en orden por filas; scores.argmax() es 8. np.unravel_index(8, scores.shape) recupera la coordenada (2, 2).
Utiliza keepdims=True cuando un resumen deba alinearse con la tabla original. scores.sum(axis=1, keepdims=True) tiene forma (4, 1), por lo que sirve para un valor de normalización por fila. Sin él, el resultado tiene forma (4,).
Conserva los totales intermedios cuando importe el orden
np.cumsum([3, 1, 4, 1, 5]) da [3 4 8 9 14]. Cada posición es el total acumulado hasta ese punto. np.cumprod([1, 2, 3, 4]) da de forma similar [1 2 6 24]. np.diff([3, 1, 4, 1, 5]) da las cuatro variaciones entre valores vecinos [-2 3 -3 4]. En una tabla, especifica axis=1 para obtener sumas acumuladas independientes a lo largo de las filas.
Indica la convención de dispersión
std y var dividen el total de las desviaciones al cuadrado entre el número de valores de forma predeterminada: ddof=0. Utiliza ddof=1 para la fórmula muestral, cuyo divisor es una unidad menor. Para [2, 4, 4, 4, 5, 5, 7, 9], la media es 5, la desviación estándar predeterminada es 2,0 y la desviación estándar muestral es aproximadamente 2,14. Un informe debe dejar claro qué convención utiliza.
Puntos clave
- El argumento
axisindica el eje que se reduce. - Sin eje se obtiene un resumen de todo el arreglo.
argminyargmaxdevuelven posiciones, incluida la primera posición en caso de empate.keepdims=Trueconserva los ejes reducidos con longitud 1.- Las funciones acumulativas conservan los resultados intermedios.
- NumPy usa
ddof=0de forma predeterminada;ddof=1selecciona el divisor muestral. - Prefiere las agregaciones de NumPy a las funciones incorporadas de Python para arreglos.
5.2 Utiliza medianas, percentiles, ordenación y valores distintos
Los resúmenes basados en el orden describen dónde se sitúan los valores en una distribución ordenada. La ordenación también permite clasificar registros, pero una tabla requiere cuidado para mantener juntos los campos de cada registro.
Localiza el centro y los cuartiles
Para x = np.array([12, 15, 11, 20, 18, 14]), el orden es [11 12 14 15 18 20]. Con seis valores, np.median(x) calcula la media de los dos centrales, 14 y 15, y da 14,5. Para un número impar de valores, la mediana es el único valor central.
np.percentile(x, q) acepta un porcentaje de 0 a 100. np.quantile(x, q) acepta la fracción equivalente de 0 a 1. Su interpolación lineal predeterminada puede dar un valor entre observaciones. Para seis valores, la posición del percentil 25 contando desde cero es 0,25 × 5 = 1,25. Está a un cuarto del recorrido entre 12 y 14, lo que da 12,5. Los percentiles 50 y 75 son 14,5 y 17,25, por lo que el rango intercuartílico es 4,75.
La mediana resiste un valor extremo más que la media. Añadir 200 a estos datos desplaza la media de 15,0 a aproximadamente 41,4; la mediana pasa de 14,5 a 15,0. Ninguna de las dos medidas describe por sí sola toda la distribución.
Elige entre datos ordenados o posiciones de ordenación
np.sort(x) devuelve una copia ordenada. x.sort() modifica x y devuelve None, por lo que y = x.sort() no coloca los valores ordenados en y. Para obtener valores descendentes, utiliza np.sort(x)[::-1].
En un arreglo de 2 dimensiones, la ordenación se realiza de forma predeterminada sobre el último eje, ordenando cada fila de manera independiente. axis=0 ordena cada columna de manera independiente. Ninguna de las dos operaciones ordena registros. Para tab = np.array([[3, 1], [1, 2], [2, 0]]), np.sort(tab, axis=0) da [[1 0] [2 1] [3 2]], separando valores que originalmente pertenecían al mismo registro.
Para conservar los registros, obtén un orden a partir de la columna clave y aplícalo a las filas completas:
order = tab[:, 0].argsort()
ranked = tab[order]
# array([[1, 2], [2, 0], [3, 1]])
El mismo orden de índices puede reordenar vectores relacionados. Si avg = np.array([85.0, 64.0, 91.33, 73.33]) y names = np.array(['Ana', 'Ben', 'Chen', 'Dara']), order = np.argsort(avg)[::-1] ordena las medias de forma descendente. names[order] da ['Chen' 'Ana' 'Dara' 'Ben'].
Cuenta valores distintos y comprueba la pertenencia
np.unique devuelve valores distintos ordenados. Con return_counts=True, también devuelve los recuentos correspondientes:
colors = np.array(['red', 'blue', 'red', 'green', 'blue', 'red'])
values, counts = np.unique(colors, return_counts=True)
Los resultados son ['blue' 'green' 'red'] y [2 1 3]. values[counts.argmax()] encuentra el valor más frecuente, 'red'. Las posiciones de los recuentos corresponden a las de los valores distintos.
np.isin(a, allowed) devuelve una máscara de pertenencia a una colección. Para a = np.arange(1, 6), np.isin(a, [2, 4]) da [False True False True False], lista para seleccionar esos valores o sus registros asociados.
Puntos clave
- La mediana usa la posición ordenada y resiste los valores extremos.
- Los percentiles usan 0–100; los cuantiles usan 0–1.
- La interpolación predeterminada de percentiles puede situarse entre observaciones.
np.sortcopia;.sort()de un arreglo lo modifica y devuelveNone.- Utiliza las posiciones de
argsortpara mantener alineados los registros y los arreglos relacionados. unique(..., return_counts=True)empareja valores distintos con sus frecuencias.isincrea una máscara de pertenencia.
5.3 Resume datos con valores faltantes y condiciones
Los datos faltantes y los subconjuntos filtrados necesitan un criterio explícito de resumen. Un resultado numérico puede ser incorrecto aunque la operación con el arreglo se ejecute correctamente: un marcador puede contarse como una medición o un subconjunto vacío puede confundirse con una media significativa.
Detecta los valores faltantes antes de resumir
NaN se propaga en las sumas y medias ordinarias. Para x = np.array([3.0, np.nan, 5.0]), tanto x.sum() como x.mean() dan NaN. np.nansum(x) da 8,0 y np.nanmean(x) da 4,0, omitiendo la posición faltante. Las funciones relacionadas incluyen nanmax, nanmin, nanstd y nanmedian. Si todos los valores son faltantes, nanmean devuelve NaN con una advertencia porque no quedan valores observados.
Para mediciones de un sensor en °C:
r = np.array([21.5, np.nan, 22.1, 23.0, np.nan, 21.9])
missing = np.isnan(r)
missing.sum() es 2, missing.mean() es aproximadamente 0,33 y r[~missing] conserva cuatro mediciones. np.nanmean(r) es 22,125, usando solo esos cuatro valores. La comparación r == np.nan no marcaría las mediciones faltantes.
Convierte primero los códigos usados como marcadores
Un número como −999 puede representar datos faltantes en un sistema de entrada. NumPy lo trata como una medición real hasta que lo sustituyas:
v = np.array([12, -999, 15, -999, 9]).astype(float)
v[v == -999] = np.nan
np.nanmean(v) # 12.0
Convierte primero a coma flotante porque un arreglo de enteros no puede almacenar NaN. Esta sustitución solo es apropiada cuando −999 está definido como código de valor faltante para esos datos.
El relleno cambia la distribución
Sustituir las temperaturas faltantes por cero hace que la media del ejemplo sea 14,75, aunque no se haya observado ninguna medición de temperatura cero. Rellenarlas con la media observada, 22,125, conserva esa media, pero reduce la dispersión aparente. Un valor de relleno es una estimación introducida, por lo que su efecto debe tenerse en cuenta en la decisión de análisis.
Para una tabla D de 2 dimensiones, np.nanmean(D, axis=0) resume los valores observados de cada columna. Cada columna puede tener un recuento distinto. Para eliminar las filas que contienen algún valor faltante:
complete = ~np.isnan(D).any(axis=1)
clean_rows = D[complete]
La reducción crea una decisión por fila; la negación conserva las filas sin entradas faltantes. Con D = np.array([[1., 2.], [np.nan, 4.], [5., np.nan], [7., 8.]]), esto conserva [[1. 2.] [7. 8.]].
Resume una condición o un grupo
Para las temperaturas t, t[t > 20].mean() calcula la media solo de los días por encima de 20 °C. En datos agrupados, utiliza una máscara con la etiqueta correspondiente: con group = np.array(['A', 'B', 'A', 'B', 'A']) y value = np.array([10, 20, 14, 26, 12]), value[group == 'A'].mean() es 12,0 y la media correspondiente de B es 23,0. Recorre np.unique(group) para repetir esto con cada grupo.
Antes de resumir un subconjunto filtrado, comprueba mask.any(). La media de una selección vacía es NaN con una advertencia, mientras que su suma es 0. Ese cero puede ser un total válido para un conjunto vacío, pero no demuestra que hubiera alguna medición presente.
Puntos clave
- Las sumas y medias ordinarias propagan NaN; las versiones que omiten NaN lo saltan.
- Convierte los códigos definidos de valores faltantes a NaN en almacenamiento de coma flotante.
- Rellenar valores faltantes cambia los estadísticos.
- Las comprobaciones de valores faltantes por fila pueden identificar registros completos.
- Combina máscaras de etiquetas o condiciones con agregaciones.
- Comprueba si un subconjunto está vacío antes de interpretar su media.
6Genera números aleatorios y ejecuta simulaciones
Los arreglos aleatorios permiten obtener muestras repetibles y realizar experimentos prácticos. Crea un Generator con semilla, elige una distribución y una forma de salida, y conserva las relaciones entre registros al mezclar o dividir datos. En una simulación, define explícitamente la estructura del ensayo antes de calcular sucesos o posiciones acumuladas. Compara los resultados con casos exactos sencillos y distingue la variación ordinaria del muestreo de los errores de código.
6.1 Obtén muestras aleatorias reproducibles con un Generator
Un generador de números aleatorios permite realizar muestreo, mezclado y simulaciones. Una semilla hace que el estado inicial sea repetible, por lo que puedes volver a ejecutar un análisis mientras investigas su lógica.
Crea un Generator y reutilízalo
rng = np.random.default_rng(42)
NumPy recomienda esta interfaz Generator para el código nuevo. Su generador de bits predeterminado es PCG64. Sin una semilla, default_rng() obtiene entropía nueva del sistema operativo. Las llamadas antiguas como np.random.seed y np.random.rand usan un estado global compartido; los objetos Generator permiten que un análisis gestione directamente su propio estado.
Los valores pseudoaleatorios proceden de un algoritmo determinista. El mismo estado inicial y la misma secuencia de llamadas reproducen la secuencia en el mismo entorno. Cada extracción hace avanzar el estado. Crear un Generator nuevo con la semilla 42 dentro de cada pasada de un bucle reinicia la secuencia y repite las mismas extracciones iniciales en lugar de continuarla. Registra la versión de NumPy y el código además de la semilla, porque no se garantiza la compatibilidad de la secuencia entre versiones ni en todos los entornos. Para contraseñas o tokens de seguridad, utiliza el módulo secrets de Python.
Elige una distribución y una forma de salida
| Llamada | Significado |
|---|---|
rng.random(5) | Cinco decimales desde 0 incluido hasta 1 excluido |
rng.uniform(2, 8, size=5) | Cinco extracciones uniformes en el intervalo de 2 a 8 |
rng.integers(1, 7, size=10) | Diez enteros desde 1 hasta 6 incluidos |
rng.normal(loc=170, scale=10, size=(3, 4)) | Una muestra de 3 por 4 de una distribución normal |
size puede ser un número de elementos o una tupla de forma. Para normal, loc es la media de la distribución y scale es su desviación estándar. Por tanto, una varianza de 100 necesita scale=10. La media y la desviación estándar reales de una muestra pequeña no tienen por qué coincidir exactamente con los parámetros de la distribución.
Para las extracciones de enteros, el límite superior se excluye de forma predeterminada. Un dado necesita integers(1, 7), ya que integers(1, 6) no puede obtener 6. integers(1, 6, endpoint=True) incluye el límite superior y también modela un dado.
Toma muestras con o sin reemplazo
rng.choice(['heads', 'tails'], size=5) realiza cinco extracciones con reemplazo. Un valor puede aparecer varias veces. Para obtener posiciones distintas, utiliza replace=False; solicitar más posiciones de las que tiene la población genera ValueError. Las probabilidades pueden proporcionarse como p=[0.7, 0.3], en el mismo orden que los valores, y deben sumar 1.
El muestreo sin reemplazo impide seleccionar dos veces una posición de entrada. Si los propios datos de entrada contienen valores duplicados, todavía pueden aparecer valores iguales en la muestra.
Mezcla registros sin separar sus campos
rng.shuffle(a) reorganiza el arreglo existente y devuelve None. rng.permutation(a) devuelve una copia mezclada. rng.permutation(10) da los enteros del 0 al 9 en orden aleatorio, útiles como índices de filas.
Para un arreglo de 2 dimensiones, el eje predeterminado es 0: las filas completas se mueven juntas. Esto mantiene alineados los campos de cada observación. Para mezclar dos arreglos relacionados de forma coherente, genera una permutación de sus índices de registro compartidos y aplícala a ambos.
Puntos clave
- Crea un Generator con semilla una sola vez y reutiliza su estado, que avanza con cada extracción.
- La reproducibilidad depende de la semilla, las llamadas y el entorno numérico.
- Las extracciones de enteros excluyen el límite superior salvo con
endpoint=True. scalede la distribución normal es la desviación estándar, no la varianza.choicetoma muestras con reemplazo de forma predeterminada.shufflemodifica el arreglo;permutationdevuelve un resultado mezclado.
6.2 Ejecuta simulaciones vectorizadas
Una simulación vectorizada representa ensayos repetidos como arreglos, aplica la regla del suceso a esos arreglos y resume los resultados. La forma del arreglo debe mostrar qué contiene un ensayo.
Convierte un suceso en una proporción
rng = np.random.default_rng(42)
rolls = rng.integers(1, 7, size=100_000)
estimate = (rolls == 6).mean()
La máscara es verdadera una vez por cada 6 observado. Su media estima la probabilidad de ese suceso, cercana a 1/6, o aproximadamente 0,1667. rolls.mean() responde a una pregunta distinta: el valor medio de la cara del dado, cercano a 3,5. Una semilla fija repite una estimación; no hace que esa estimación sea exacta.
La vectorización evita el trabajo al nivel de Python para cada extracción, por lo que las simulaciones grandes suelen ser mucho más rápidas que con un bucle. La aceleración depende del cálculo, el tamaño del arreglo y la computadora, así que no es una propiedad fija del suceso.
Utiliza una fila por ensayo con varios valores
Para simular dos dados en cada ensayo:
dice = rng.integers(1, 7, size=(100_000, 2))
totals = dice.sum(axis=1)
p_seven = (totals == 7).mean()
La tabla tiene 100 000 filas de ensayos y dos columnas de dados. Reducir el eje 1 produce un total por ensayo. Seis de los 36 pares ordenados equiprobables suman 7, por lo que la probabilidad estimada debería estar cerca de 6/36. En cambio, reducir el eje 0 daría dos totales de todos los ensayos y perdería el suceso a nivel de ensayo.
Las simulaciones más grandes siguen variando
Para ensayos independientes, el error estándar de una proporción estimada es:
Aquí es la probabilidad del suceso y el número de ensayos. Para obtener un 6 en un dado con 100 000 ensayos, es aproximadamente 0,0012. Una aproximación normal sitúa aproximadamente el 95 % de las estimaciones a una distancia máxima de 0,0023 de 1/6. Multiplicar el número de ensayos por 100 reduce el error estándar por un factor de 10. Más extracciones no corrigen un suceso codificado incorrectamente.
Crea e inspecciona un paseo aleatorio
steps = rng.choice([-1, 1], size=1000) obtiene pasos a la izquierda o a la derecha. walk = steps.cumsum() da la posición después de cada paso. Su máximo y su mínimo localizan las posiciones extremas visitadas. Para encontrar el primer punto situado al menos a 10 unidades del inicio:
hit = np.abs(walk) >= 10
if hit.any():
step_count = hit.argmax() + 1
argmax localiza la primera entrada verdadera, pero también devuelve 0 cuando todas las entradas son falsas. La comprobación con any() distingue una llegada real de la ausencia de una llegada. Suma 1 porque la posición 0 del arreglo es la posición después del paso 1.
Para muchos paseos, rng.choice([-1, 1], size=(5000, 1000)).cumsum(axis=1) acumula por separado a lo largo de cada fila. walks[:, -1] selecciona todas las posiciones finales; su media está cerca de 0 y su desviación estándar cerca de la raíz cuadrada de 1000, aproximadamente 31,6.
Utiliza permutaciones y comprobaciones exactas
Una división aleatoria de 100 registros puede usar idx = rng.permutation(100) y después data[idx[:80]] y data[idx[80:]]. Los dos segmentos disjuntos de una misma permutación asignan cada registro exactamente una vez. Para una simulación, compara un caso sencillo con una respuesta exacta, como una media del dado de 3,5, antes de confiar en resultados más complicados.
Puntos clave
- Representa con claridad un ensayo en la forma del arreglo.
- Una media booleana estima la probabilidad de un suceso.
- Reduce dentro de los ensayos antes de combinar los resultados entre ensayos.
- El error estándar disminuye con la raíz cuadrada del número de ensayos.
- Comprueba si hay una llegada antes de usar
argmaxpara localizar la primera. - Una permutación puede producir divisiones aleatorias disjuntas de registros.
- Valida la lógica de la simulación con un caso sencillo exacto.
Ejemplos de Arreglos de NumPy
1Crea un arreglo de mediciones fiable
14 pasos
- 1IntroducciónPlanifica los registros y las mediciones
Una tabla de mediciones necesita dos decisiones antes de cualquier cálculo: qué representa cada eje y qué clase de valores deben almacenarse. Crearemos una tabla pequeña, inspeccionaremos su forma y elegiremos métodos de creación y conversión que conserven los datos.
Mantén
import numpy as npal principio del script. El nombrenpda acceso a las funciones de NumPy utilizadas en todos los ejemplos. - 2ExplicaciónInterpreta una tabla mediante sus ejes
Crea
a = np.array([[2, 4, 6], [3, 5, 7]]). La secuencia exterior proporciona dos filas; cada secuencia interior proporciona tres valores.a.shapees(2, 3),a.ndimes 2 ya.sizees 6. La forma describe la disposición, ndim cuenta los ejes y el tamaño cuenta todas las entradas. Si cada fila es un registro, esta tabla contiene dos registros con tres mediciones cada uno. - 3Idea claveTamaños iguales pueden tener estructuras distintas
Un vector de longitud seis tiene forma
(6,). Una tabla con una fila tiene forma(1, 6)y una tabla con una columna tiene forma(6, 1). Cada uno contiene seis valores, pero solo los dos últimos tienen ejes separados de filas y columnas.La coma final de
(6,)indica una tupla de un solo elemento. Es información útil: el vector tiene un eje, por lo que no tiene una dirección de filas separada que se pueda transponer para formar una columna. - 4DesafíoPredice la multiplicación antes de ejecutarla
¿Cuáles son los resultados de
[2, 5] * 2ynp.array([2, 5]) * 2?---reveal---
La lista se convierte en
[2, 5, 2, 5]. El arreglo se convierte en[4 10]. Las listas repiten su contenido al multiplicarse por un entero; los arreglos numéricos multiplican los valores en cada posición. El arreglo conserva su forma, lo que permite aplicar un cálculo a cada valor registrado. - 5EjemploReserva una tabla de forma conocida
Supón que dos estaciones proporcionarán cada una cuatro mediciones de lluvia en milímetros. Crea
rain = np.zeros((2, 4))y después asignarain[0] = [4.0, 0.0, 3.5, 6.0].La tupla
(2, 4)es un único argumento de forma. Zeros usa almacenamiento de coma flotante de forma predeterminada, por lo que se conserva la medición 3,5. Reservar la forma final una sola vez evita copiar repetidamente un arreglo que crece a medida que llegan las mediciones. - 6ConsejoElige deliberadamente el relleno inicial
Utiliza
zeroscuando los ceros iniciales tengan significado,onespara unos yfull(shape, value)para otro valor repetido. Sus nombres describen el contenido inicial.emptysolo reserva almacenamiento. Sus valores iniciales no están listos para usarse, por lo que cada entrada debe rellenarse antes de leerse. Una tabla rellena de ceros es más fácil de inspeccionar mientras escribes código que solo asignará algunas de sus entradas. - 7ExplicaciónCuenta los puntos y los intervalos por separado
Para posiciones de medición desde 0 m hasta 2 m, incluidos ambos extremos, a intervalos de 0,5 m, hay cinco puntos y cuatro intervalos.
np.linspace(0, 2, 5)crea esos puntos e incluye ambos extremos.np.arange(0, 2, 0.5)utiliza un paso y excluye el valor final, por lo que omite 2 m. El redondeo de coma flotante también puede hacer que las cuadrículas decimales dearangesean inesperadas; utilizalinspacecuando el requisito sea el número de puntos. - 8DesafíoElige una cuadrícula a partir de sus extremos
Una exploración requiere nueve posiciones uniformemente espaciadas desde 0 cm hasta 4 cm, incluidos ambos extremos. ¿Qué llamada de creación es adecuada y cuál es el espaciado?
---reveal---
Utiliza
np.linspace(0, 4, 9). Nueve puntos forman ocho intervalos a lo largo de 4 cm, por lo que el espaciado es 0,5 cm. Un tercer argumento de 8 solicitaría ocho puntos, dejando solo siete intervalos y produciendo una distancia diferente entre mediciones. - 9ExplicaciónInspecciona el tipo de datos inferido
np.array([1, 2.5])se convierte en un arreglo de coma flotante porque un tipo de datos compartido debe contener ambos valores. En cambio, mezclar un número con texto puede convertir todos los valores en texto y hacer que fallen las operaciones aritméticas.Inspecciona
a.dtypecuando los valores no se comporten como esperas.a.itemsizeindica los bytes de almacenamiento por elemento; multiplicarlo pora.sizedaa.nbytes, el total de bytes ocupados por los elementos. - 10EjemploObserva cómo una asignación descarta decimales
Comienza con
counts = np.array([2, 4, 6])y después ejecutacounts[0] = 3.8. La primera entrada se convierte en 3 porque el almacenamiento existente sigue siendo entero.Para conservar decimales posteriores, crea primero almacenamiento de coma flotante con
values = counts.astype(float).astypecrea una copia convertida. No cambia el tipo de datos del arreglo original ni recupera la información fraccionaria que una asignación anterior ya haya descartado. - 11Idea claveLa conversión y el redondeo son operaciones distintas
np.array([2.8, -2.8]).astype(int)da[2 -2]: el truncamiento se dirige hacia cero.np.roundredondea al más cercano, llevando las mitades exactas al par, por lo que 2,5 se redondea a 2,0.Los tipos enteros pequeños introducen un riesgo distinto. Un
uint8no puede contener 260, por lo que la aritmética con arreglos, como 250 más 10, puede volver al otro extremo y dar 4. Amplía el tipo de datos antes de calcular valores que puedan superar su intervalo. - 12DesafíoConserva una medición faltante
Tienes
a = np.array([5, 7, 9])y necesitas marcar su medición central como faltante. ¿Qué preparación necesita el arreglo antes de asignar NaN?---reveal---
Convierte a almacenamiento de coma flotante:
a = a.astype(float)y después establecea[1] = np.nan. El almacenamiento entero no puede representar NaN. El resultado es[5. nan 9.]; sustituirlo por cero registraría un valor numérico en lugar de marcar una medición faltante. - 13DesafíoCombina la creación con una actualización posterior
Creas
template = np.array([1, 2])y después necesitas un arreglo de la misma forma cuyos valores puedan incluir más adelante 1,5 y NaN. ¿Qué opción de creación permite esos valores?---reveal---
Utiliza un tipo de datos de coma flotante, por ejemplo
np.zeros_like(template, dtype=float). La función like predeterminada heredaría almacenamiento entero. La forma puede seguir siendo(2,), mientras que elegir coma flotante permite tanto la medición fraccionaria como el marcador de valor faltante. - 14RepasoInspecciona la estructura antes de calcular
Para el próximo arreglo que crees, inspecciona
shape,sizeydtypeantes de aplicar operaciones aritméticas. Comprueba que cada eje represente el grupo de valores previsto y que el almacenamiento pueda contener las mediciones que asignarás.Elige deliberadamente un número de puntos o un paso al generar una cuadrícula. Si aparecerán valores decimales o NaN, prevé almacenamiento de coma flotante antes de escribir esos valores en el arreglo.
2Selecciona registros y controla qué cambian las modificaciones
16 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónPregúntate qué valores deben estar en el resultado
- 2ExplicaciónSigue el inicio, el final y el paso
- 3EjemploSelecciona filas y columnas en una expresión
- 4DesafíoConserva un eje de columna
- 5EjemploSigue una escritura mediante una vista
- 6ConsejoHaz explícita la independencia
- 7ExplicaciónEmpareja coordenadas o elige un bloque
- 8DesafíoDistingue una copia de una asignación directa
- 9ExplicaciónConvierte una condición en una selección
- 10EjemploCombina los límites de un intervalo
- 11Idea claveCuenta sucesos o calcula la media de sus valores
- 12EjemploElige entre sustitución y filtrado
- 13DesafíoConserva filas completas
- 14ConsejoDetecta NaN sin usar la igualdad
- 15DesafíoActualiza los registros seleccionados de forma independiente
- 16RepasoComprueba el destino de cada modificación
3Da a los valores la forma y la agrupación adecuadas
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónHaz visible la agrupación en la forma
- 2EjemploAgrupa valores consecutivos en períodos
- 3ExplicaciónInfiere una dimensión faltante
- 4EjemploIntercambia el significado de filas y columnas
- 5DesafíoCrea una columna a partir de un vector
- 6ConsejoElige el aplanamiento teniendo en cuenta la edición
- 7ExplicaciónAmplía un eje existente
- 8EjemploAñade en cambio un eje de lotes
- 9DesafíoCrea dos columnas de mediciones
- 10EjemploDivide por límites o por número de partes
- 11DesafíoReconstruye una tabla a partir de lotes de filas
- 12RepasoInterpreta las formas como decisiones sobre los datos
4Calcula sobre registros sin un bucle de Python
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDeja que la expresión describa el cálculo
- 2EjemploMultiplica valores emparejados y súmalos
- 3ExplicaciónUtiliza el operador de producto adecuado
- 4ConsejoComprueba el destino y el denominador
- 5DesafíoElige la referencia de la variación porcentual
- 6ExplicaciónAplica funciones matemáticas a arreglos
- 7EjemploCalcula distancias por etapas
- 8DesafíoCompara maximum con una reducción
- 9ConsejoInspecciona el redondeo y los valores no válidos
- 10ExplicaciónAlinea las formas por sus extremos derechos
- 11EjemploConserva las medias de las filas como una columna
- 12Idea claveUna difusión válida puede responder a la pregunta equivocada
- 13DesafíoPredice el resultado de una difusión
- 14DesafíoPondera mediciones centradas
- 15RepasoComprueba los valores, el emparejamiento y la forma de salida
5Resume las observaciones que responden a tu pregunta
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónElige la pregunta antes que el estadístico
- 2EjemploReduce el eje de mediciones
- 3Idea claveSigue lo que permanece tras la reducción
- 4EjemploDistingue posición, valor y suma acumulada
- 5DesafíoElige el divisor de la varianza
- 6EjemploLocaliza una mediana y un percentil
- 7ConsejoOrdena registros mediante posiciones
- 8DesafíoRecupera una etiqueta a partir de su recuento
- 9ExplicaciónOmite deliberadamente los valores faltantes
- 10EjemploConvierte un código de valor faltante antes de calcular la media
- 11Idea claveEl relleno crea observaciones para el cálculo
- 12EjemploCrea una decisión de completitud por fila
- 13DesafíoReconoce un subconjunto vacío
- 14DesafíoResume y compara grupos
- 15RepasoComunica qué contribuyó a cada resumen
6Ejecuta una simulación reproducible desde las extracciones hasta los resultados
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDa una forma clara a cada ensayo simulado
- 2ExplicaciónCrea el Generator una sola vez
- 3EjemploEstablece los parámetros de extracciones enteras y normales
- 4DesafíoDetecta el error de aleatoriedad repetida
- 5ConsejoElige el reemplazo y conserva los registros
- 6EjemploEstima un suceso con una máscara
- 7EjemploReduce dentro de cada ensayo de dos dados
- 8DesafíoCambia el suceso a cualquiera de los dados
- 9ExplicaciónEspera variación del muestreo
- 10EjemploAcumula pasos en una trayectoria
- 11ConsejoComprueba si se alcanzó el límite
- 12DesafíoDivide los registros exactamente una vez
- 13DesafíoDecide qué puede corregir una ejecución mucho mayor
- 14RepasoComprueba el modelo y después su precisión
Ejercicios de Arreglos de NumPy
Set 1: Interpreta arreglos y elige la operación adecuada10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
(8, 5). (5, 8) invierte las funciones de los registros y las mediciones. Hay 40 elementos en total, pero ese tamaño no sustituye la forma de dos ejes.Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
np.linspace(0, 3, 7) da un espaciado de 0,5 m e incluye ambos extremos. np.arange(0, 3, 0.5) se detiene antes de 3 y da solo seis puntos. En linspace, el tercer argumento cuenta puntos, no intervalos.Pregunta 3 de 10
np.array([4.9, -4.9]).astype(int)?Mostrar respuestaOcultar respuesta
astype(int) elimina la parte fraccionaria hacia cero y da 4 y −4. El resultado [5, -5] requeriría redondear primero al valor más cercano. La división por suelo utiliza una dirección distinta para los valores negativos y no describe esta conversión.Pregunta 4 de 10
v = np.array([2, 8, 11, 5, 14]), ¿qué fracción devuelve (v >= 8).mean()?Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
[batch_id, mass_kg]: d = np.array([[1, 4], [2, 9], [1, 7], [2, 5]]). ¿Cuál es la masa media de los registros del lote 1 cuya masa supera 5 kg?Mostrar respuestaOcultar respuesta
[1, 7], por lo que la masa media es 7,0 kg. Una media de 5,5 kg incluye ambos registros del lote 1 y omite la condición de masa; 8,0 kg ignora la condición de lote.Pregunta 6 de 10
np.arange(8).reshape(2, 4).T[1]?Mostrar respuestaOcultar respuesta
[0, 1, 2, 3] y [4, 5, 6, 7]. La transposición convierte su segunda columna en la fila 1, [1, 5]. Obtener [2, 3] supondría reagrupar la secuencia original en filas de longitud dos, lo que es un cambio de forma en lugar de un intercambio de ejes.Pregunta 7 de 10
np.array([5., 8.]) y los nuevos son np.array([6., 6.]). ¿Qué variaciones porcentuales da (new - old) / old * 100?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
cumsum(axis=1) conserva una suma acumulada para cada día en lugar de devolver un solo total por máquina.Pregunta 9 de 10
d = np.array([[9, 30], [2, 80], [5, 40]]). ¿Cómo puedes ordenar los registros por su primera columna, de menor a mayor, manteniendo junta cada fila?Mostrar respuestaOcultar respuesta
argsort() da las posiciones de las filas en el orden 1, 2, 0. Aplicar esas posiciones a d mueve registros completos. Ordenar las columnas de forma independiente con np.sort(d, axis=0) separaría los valores de la primera columna de los valores de la segunda con los que se registraron originalmente.Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Set 2: Relaciona selecciones, formas y resúmenes10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
np.arange(4, 16, 5)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
template = np.array([2, 4, 6]), ¿qué valores crea np.full_like(template, 1.8) con el tipo de datos predeterminado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
a después de a = np.arange(7); b = a[1:5]; c = a[[1, 4]]; b[1] = 90; c[0] = 80?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
a = np.array([3, 6, 9, 12, 15, 18, 21]), ¿qué valores selecciona a[1:6:2]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
a y b tienen formas (3, 2) y (3, 5). ¿Qué forma tiene np.concatenate([a, b], axis=1)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
x = np.array([-3.5, 2.5]), ¿qué da np.floor(x) - np.trunc(x)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
x = np.array([6., 8.]) e y = np.array([8., 15.]) en metros, conserva solo los puntos situados como máximo a 12 m del origen. ¿Cuáles son las distancias conservadas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
x = np.array([10., np.nan, 16., np.nan, 22.]), ¿cuál es la media después de sustituir cada NaN por cero?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
rng.choice(np.arange(5), size=6, replace=False)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
dice contiene 60 000 ensayos de tres dados equilibrados con forma (60000, 3). ¿Qué expresión estima la probabilidad de que un ensayo contenga al menos un 6?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Sigue los datos a través de varias operaciones con arreglos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
a = np.array([8, 12]); a[0] = 3.7; b = a / 2?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
m = np.arange(20).reshape(4, 5), ¿cuáles son la forma y los valores de m[1:3, 2:3]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
t de forma (3, 4, 5), ¿qué forma tiene t[1, :, 2:4]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
v = np.arange(1, 13) se agrupan en cuatro períodos consecutivos de tres horas. Después de intercambiar los ejes de período y posición dentro del período, ¿cuál es la primera fila?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
np.array_split(np.arange(14), 4)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
A = np.array([[2, 3], [4, 5]]), ¿qué devuelve A * A?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
X son [2., 6.] y [8., 12.]. Es necesario restar a cada fila su propia media. ¿Qué resultado da realmente la expresión equivocada X - X.mean(axis=1)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
x = np.array([1., 3., 5.]), ¿cuánto vale x.var(ddof=1)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
np.percentile([4, 8, 12, 20], 25)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
steps contiene cinco movimientos de ±1 de un paseo. Necesitas la proporción de paseos que alcanzan al menos 3 unidades de distancia del inicio en algún paso registrado. ¿Qué expresión calcula esa proporción?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Diagnostica resultados que parecen plausibles10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
a tiene forma (6, 4) y itemsize == 8. Ejecutas b = a[::2, 1:] y después c = b[:, ::2].copy(). ¿Cuántos bytes de almacenamiento de elementos tiene c?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
np.array([4, 7]) * 3?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
m = np.arange(12).reshape(3, 4), ¿qué es m[[0, 2], [1, 3]]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
[group, reading] de d son [[1., 6.], [2., np.nan], [1., 10.], [2., 14.], [1., np.nan]]. ¿Cómo puedes obtener la media de las mediciones presentes en el grupo 1?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
v = np.arange(5), ¿cómo se comparan v.T.shape y v[:, np.newaxis].shape?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
x = np.array([-4., 2., 7.]), ¿qué produce np.maximum(x, 3)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
(3, 2) contiene valores emparejados para tres registros. Un vector offset de longitud tres da una corrección por registro. Necesitas sumar cada corrección a ambos valores de su propio registro. ¿Qué expresión y forma resultante son adecuadas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
values, counts = np.unique([4, 9, 4, 2, 9, 9], return_counts=True). ¿Qué devuelve values[counts.argmax()]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
D = np.array([[2., 4.], [np.nan, 6.], [8., np.nan]]), ¿qué devuelve np.nanmean(D, axis=0)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
ids = np.arange(6) y un arreglo de mediciones separado tienen el mismo orden de registros. Necesitas cuatro registros de entrenamiento y dos de prueba, con identificadores y mediciones correspondientes y sin solapamiento. ¿Qué plan garantiza esto?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Combina herramientas de arreglos en análisis completos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
np.array([5, -999, 9]), donde −999 significa que el valor es faltante. Necesitas la media observada después de añadir una corrección de 0,5 a cada medición presente. ¿Cuál es el resultado correcto?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
a = np.array([2, 5, 8, 11]); b = a[1:]; c = b[[0, 2]]; b[0] = 20; c[1] = 30; a[[0, 3]] = c. ¿Qué es a después?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
x = np.array([1., np.nan, 4., 7.]), quieres obtener la proporción de valores observados que superan 3. ¿Cuál es esa proporción?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
(2, 3). ¿Qué forma resulta de np.stack([a, b], axis=1)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
a = np.array([3, 6]), necesitas los valores [3.5, 6.5]. ¿Por qué funciona a = a + 0.5 mientras que a += 0.5 genera un error?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
X = np.array([[2., 6., 10.], [4., 8., 12.]]) se centra por separado en cada fila. ¿Qué resultado debería producir la expresión correcta?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
X = np.array([[3., 9.], [5., 7.], [8., 4.]]) contiene dos mediciones. Centra cada fila, después pondera la primera columna por 0,25 y la segunda por 0,75 y suma dentro de cada fila. ¿Qué resultados se obtienen?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
x = np.array([7, 12, 12, 4]), ¿cuánto vale x.argmax()?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
[group, reading] de D son [[1., 4.], [1., np.nan], [2., 8.], [2., 10.], [2., np.nan]]. Rellena cada medición faltante con la media observada de su propio grupo. ¿Cuál es la media de las cinco mediciones después del relleno?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Agregación (reducción)
table.mean(axis=0) combina los registros para dar una media por cada columna de mediciones.Agregación que omite valores NaN
nanmean o nanmedian.np.nanmean([5., np.nan, 9.]) devuelve 7,0 al calcular la media de los dos valores observados.Ajuste de grados de libertad
ddof, la cantidad que se resta del número de valores en el divisor de la varianza o la desviación estándar.ddof=1, NumPy divide el total de las desviaciones al cuadrado entre cuatro.Almacenamiento homogéneo
np.array([2, 3.5]), la entrada entera se convierte en un número de coma flotante para que ambos elementos compartan ese tipo de almacenamiento.Apilamiento
(3, 5), con un vector de entrada por fila.Apilamiento por columnas
np.column_stack para crear un registro de dos mediciones por persona.Aplanamiento
flatten copia los datos, mientras que ravel puede compartir los datos originales.table.flatten() cuando necesites un resultado independiente de 1 dimensión cuyas modificaciones no puedan cambiar la tabla.Aritmética elemento a elemento
(2, 3) con * da seis productos emparejados en otro arreglo (2, 3).Arreglo multidimensional o array (ndarray)
(50, 3).Arreglo sin inicializar
np.empty(100) solo cuando el código posterior vaya a rellenar cada entrada antes de que algún cálculo la utilice.Asignación mediante índices
data[:2, 0] = 0 sustituye los valores de la primera columna en las dos primeras filas de la tabla.C
Cambio de forma (reshape)
(4, 3) cuando cada fila debe contener los tres meses de un trimestre.Centrado
X - X.mean(axis=0) resta la media de cada columna de los valores de esa misma columna.Código de valor faltante
Concatenación
(2, 4) y (5, 4) a lo largo del eje 0 crea una tabla de siete filas con cuatro columnas.Conversión de tipos
astype devuelve una copia convertida y algunas conversiones descartan información.np.array([2.7, 5.1]).astype(int) convierte los valores en 2 y 5 sin redondear al más cercano.Coordenadas emparejadas
m[[0, 2], [1, 3]] selecciona las coordenadas (0, 1) y (2, 3), no un bloque de 2 por 2.Copia
saved = data[:3].copy() mantiene un subconjunto independiente para modificaciones o comparaciones posteriores.Cuantil
np.quantile(x, 0.75) solicita la misma posición que np.percentile(x, 75) con opciones equivalentes.D
Desbordamiento de enteros
uint8 que contienen 250 y 10 da 4 al volver al otro extremo del intervalo, porque ese tipo de datos no puede contener 260.Desviación estándar (desviación típica)
std() utilizan el divisor N de forma predeterminada; ddof=1 selecciona la fórmula muestral.Difusión (broadcasting)
(3,) a una tabla de forma (8, 3) aplica ese vector a cada una de las ocho filas.Dimensiones compatibles
(5, 1) y (4,) se combinan en (5, 4) porque sus ejes alineados cumplen la regla de compatibilidad.Distribución normal
rng.normal.loc=100 y scale=4 utiliza una media de distribución de 100 y una desviación estándar de 4, no una varianza de 4.División de arreglos
array_split permite partes de distinta longitud.np.arange(9) en [2, 6] da partes de longitudes 2, 4 y 3 porque los números son límites.Dominio de una función
np.sqrt(-4.0) normalmente emite una advertencia y devuelve NaN.E
Eje
data[:, 0] conserva todas las posiciones del eje de filas y toma su primera columna.Eje de longitud uno
[:, None] a un vector de longitud cuatro crea la forma (4, 1), adecuada para un valor por fila de una tabla.Eje de reducción
keepdims.(6, 4) deja la forma (6,), con un resultado por cada fila original.Ensayo
Error estándar
Espaciado uniforme
linspace crea esta cuadrícula a partir de sus extremos y su número de puntos.Estandarización (tipificación)
(X - X.mean(axis=0)) / X.std(axis=0) estandariza las columnas que tienen desviaciones estándar distintas de cero.F
Fila completa
~np.isnan(data).any(axis=1) crea una entrada verdadera por cada registro completo de una tabla numérica.Forma (shape)
(2, 6) describe dos filas de seis valores, mientras que la forma (12,) describe un vector de doce valores.Función de creación de arreglos
np.full((3, 2), 8) crea tres filas de dos valores sin requerir seis entradas escritas por separado.Función suelo (floor)
np.floor aplica este redondeo hacia abajo a cada valor de entrada.np.floor da −3,0 porque −2 estaría por encima del valor negativo original.Función techo (ceiling)
np.ceil aplica este redondeo hacia arriba a los valores de un arreglo.np.ceil da −2,0, mientras que para 2,3 da 3,0.Función universal (ufunc)
np.sqrt(distances_squared) calcula una raíz cuadrada en cada posición sin usar math.sqrt de Python, que opera con escalares.Función universal binaria
np.maximum(observed, minimum) elige el mayor de dos valores alineados en cada posición de salida.Función universal unaria
np.abs sobre un vector de errores con signo produce un vector que contiene sus magnitudes.G
Generador de números aleatorios (Generator)
default_rng y reutilizado mediante métodos que hacen avanzar su estado interno.rng.integers dos veces continúa la secuencia; volver a crear rng con la misma semilla la reinicia.Í
Índice
Índice del máximo (argmax)
[3, 8, 8, 2], argmax devuelve 1, que es una posición y no el valor máximo 8.Índices de ordenación (argsort)
names[np.argsort(scores)] para listar los nombres en orden de puntuación sin perder el emparejamiento entre nombre y puntuación.I
Imputación por la media
Indexación avanzada (fancy indexing)
a[[4, 1, 4]] incluye dos veces la posición 4 y conserva el orden de salida solicitado.Indexación booleana
data[data[:, 0] > 10] conserva filas completas según la condición aplicada a su primera columna.Infinito
inf o -inf y se detecta como no finito.inf con una advertencia bajo la configuración predeterminada de NumPy.M
Máscara booleana
t > 25 marca los días cuya temperatura registrada supera 25 °C.Matriz identidad
np.eye.np.eye(4) crea cuatro unos diagonales en un arreglo de 4 por 4, con ceros en las posiciones restantes.Mediana
[1, 3, 6, 100] es 4,5, aunque el último valor, inusualmente grande, eleva mucho la media.Memoria compartida
np.shares_memory comprueba si dos arreglos concretos se solapan.Muestreo con reemplazo (con reposición)
rng.choice.N
No es un número (NaN)
[4.0, np.nan, 8.0] requieren almacenamiento de coma flotante y np.isnan identifica la posición faltante.Número de coma flotante (punto flotante)
np.allclose cuando deban tolerarse pequeñas diferencias de representación.O
Operación in situ (in-place)
+= a un arreglo de enteros falla, mientras que una suma ordinaria puede crear almacenamiento de coma flotante.Operación lógica elemento a elemento
&, | o ~ para la conjunción, la disyunción o la negación.(x >= 2) & (x <= 8) conserva los valores que cumplen ambos límites, con cada comparación entre paréntesis.Orden por filas
[0, 1, 2, 3, 4, 5] a (2, 3) coloca [0, 1, 2] en la primera fila.P
Paseo aleatorio (caminata aleatoria)
cumsum(axis=1) crea posiciones de paseo separadas a lo largo de cada fila de ensayo.Paso
np.arange.np.arange(2, 15, 4) utiliza un paso de 4 para crear la secuencia [2 6 10 14].Percentil
Permutación
rng.permutation(n) en segmentos disjuntos de índices para asignar cada registro a exactamente un subconjunto.R
Recorte de valores (clipping)
np.clip(readings, 10, 30) conserva los valores interiores y sustituye las mediciones fuera de ese intervalo por 10 o 30.Referencias compartidas (aliasing)
b = a, la expresión b is a es verdadera y asignar mediante cualquiera de los dos nombres modifica ese mismo arreglo.Resumen condicional
mass[batch == 'B'].mean() calcula la media solo de las masas cuya etiqueta de lote correspondiente es B.S
Secuencia pseudoaleatoria
Segmento (slice)
a[2:7:2] selecciona las posiciones 2, 4 y 6, saltando una posición entre los valores seleccionados.Selección condicional
np.where crea un resultado eligiendo una entrada en las posiciones verdaderas y otra en las falsas.np.where(x < 0, 0, x) sustituye los valores negativos por cero en un resultado nuevo con la misma forma general de selección.Selector entero
(8, 3), data[:, 1] devuelve la forma (8,) tras eliminar el eje de columna.Semilla
np.random.default_rng(17) al principio proporciona un punto de partida repetible para el análisis.Simulación
Suma acumulada
np.cumsum([2, 5, 1]) da [2, 7, 8], lo que resulta útil para seguir un saldo a medida que se acumulan las entradas.Suma ponderada
(scores * weights).sum(axis=1) crea un resultado ponderado para cada fila cuando las ponderaciones se alinean con las columnas.T
Tamaño (size)
(4, 7) tiene tamaño 28, aunque su atributo ndim indique solo dos ejes.Tiempo de primera llegada
Tipo de datos (dtype)
data.dtype puede revelar que una etiqueta de texto aislada hizo que valores de apariencia numérica se almacenaran como cadenas.Transposición
(2, 5) da la forma (5, 2), y cada columna original se convierte en una fila.Truncamiento
astype(int) da −7; aplicar floor daría en cambio −8.V
Valores distintos
np.unique los devuelve ordenados y también puede devolver sus recuentos de apariciones correspondientes.Vectorización
price * quantity calcula cada total de línea sin un bucle de Python separado sobre los artículos.Vista
b = a[1:4], establecer b[0] = 50 modifica a[1] porque el segmento básico comparte datos.Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.