NumPy https://interactivechaos.ovh/es es numpy.asarray https://interactivechaos.ovh/es/python/function/numpyasarray <span class="field field--name-title field--type-string field--label-hidden">numpy.asarray</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 22/01/2021 - 14:32</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">numpy.asarray</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">NumPy</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>numpy.asarray(a, dtype = None, order = None)</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>La función <a href="https://numpy.org/doc/stable/reference/generated/numpy.asarray.html">numpy.asarray</a> convierte una estructura de datos en un array NumPy.</p> <p>Esta función es semejante a <a href="https://numpy.org/doc/stable/reference/generated/numpy.array.html">np.array</a> (aunque con menos opciones), siendo la mayor diferencia el hecho de que <em>np.array</em> genera -por defecto- una copia independiente de la estructura pasada como argumento, mientras que <em>numpy.asarray</em> no.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>a</strong>: Estructura a convertir en array NumPy. La función admite gran número de tipos, incluyendo listas, tuplas, listas de tuplas, tuplas de tupas, tuplas de listas o arrays NumPy. En este último caso, el resultado de la función no es una copia independiente del array.</li> <li><strong>dtype</strong>: Tipo a asignar al resultado devuelto por la función. Si no se especifica, este tipo se infiere de la estructura de entrada.</li> <li><strong>order</strong>: {"C", "F"} Representación en memoria del array. Puede ser "C" (C-Style) o "F" (Fortran-Style).</li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p>La función <em>numpy.asarray</em> devuelve un array NumPy.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Podemos convertir una lista a array NumPy con el siguiente código:</p> <div class="codigo"> <p>a = [2, 5, 1, 4]<br /> np.asarray(a)</p> </div> <div class="respuesta"> <p>array([2, 5, 1, 4])</p> </div> </div> <div class="field__item"><p>Si no se especifica, el tipo del array devuelto se infiere de la estructura de entrada. En el siguiente ejemplo la lista a convertir incluye números y textos, por lo que el array devuelto se genera con un tipo de texto también:</p> <div class="codigo"> <p>a = [2, 5, 1, "a"]<br /> np.asarray(a)</p> </div> <div class="respuesta"> <p>array(['2', '5', '1', 'a'], dtype='&lt;U11')</p> </div> </div> <div class="field__item"><p>Si la estructura a convertir es un array NumPy, el resultado devuelto por la función no es una copia independiente de ella:</p> <div class="codigo"> <p>a = np.array([1, 2])<br /> b = np.asarray(a)</p> </div> <div class="codigo"> <p>a is b</p> </div> <div class="respuesta"> <p>True</p> </div> </div> <div class="field__item"><p>Podemos convertir una estructura especificando el tipo del array generado:</p> <div class="codigo"> <p>a = [2, 5, 1, 4]<br /> np.asarray(a, dtype = str)</p> </div> <div class="respuesta"> <p>array(['2', '5', '1', '4'], dtype='&lt;U1')</p> </div> </div> </div> </div> Fri, 22 Jan 2021 13:32:29 +0000 admin 2968 at https://interactivechaos.ovh numpy.nan https://interactivechaos.ovh/es/python/function/numpynan <span class="field field--name-title field--type-string field--label-hidden">numpy.nan</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sáb, 16/01/2021 - 12:55</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">numpy.nan</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">NumPy</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>numpy.nan</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p><a href="https://numpy.org/doc/stable/reference/constants.html?highlight=nan#numpy.nan">numpy.nan</a> es un valor especial de la librería NumPy que representa el valor nulo.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><p><em>numpy.nan</em> no acepta argumentos.</p></div> </div> <div class="clearfix text-formatted field field--name-field-python-funcion-resultado field--type-text-long field--label-above"> <div class="field__label">Resultado</div> <div class="field__item"><p><em>numpy.nan</em> devuelve un valor de tipo <em>float.</em></p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Podemos crear un array NumPy que incluya valores nulos con el siguiente código:</p> <div class="codigo"> <p>a = np.array([2, np.nan, 4, 1, np.nan])<br /> a</p> </div> <div class="respuesta"> <p>array([ 2., nan,  4.,  1., nan])</p> </div> <p>Obsérvese que el resultado es un array de tipo <em>float</em>, al incluir valores tanto enteros como reales (los valores nulos):</p> <div class="codigo"> <p>a.dtype</p> </div> <div class="respuesta"> <p>dtype('float64')</p> </div> </div> </div> </div> Sat, 16 Jan 2021 11:55:51 +0000 admin 2941 at https://interactivechaos.ovh numpy.number https://interactivechaos.ovh/es/python/function/numpynumber <span class="field field--name-title field--type-string field--label-hidden">numpy.number</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 15/01/2021 - 15:42</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">numpy.number</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">NumPy</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>numpy.number</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p><strong>numpy.number</strong> es una clase de la librería NumPy que representa a todos los tipos numéricos.</p></div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><p>La clase <em>numpy.number</em> no admite argumentos.</p></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Podemos utilizar esta clase como argumento del método <a href="/es/python/function/pandasdataframeselectdtypes">select_dtypes</a> de los DataFrames pandas para seleccionar (o excluir) las columnas numéricas. Por ejemplo, carguemos el dataset <em>titanic</em> de seaborn:</p> <div class="codigo"> <p>import numpy as np<br /> import seaborn as sns</p> </div> <div class="codigo"> <p>titanic = sns.load_dataset("titanic")<br /> titanic.head(3)</p> </div> <a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0053.jpg"><img alt="Dataset Titanic" class="image-colorbox__max_800_px align-center" data-entity-type="file" data-entity-uuid="insert-max_800_px-82c82c98-0ef4-4e79-8ad6-0f2b3183c6b3" data-insert-attach="{&quot;id&quot;: &quot;82c82c98-0ef4-4e79-8ad6-0f2b3183c6b3&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0053.jpg" /></a> <p>Ahora, si aplicamos el método <em>.select_dtypes</em> especificando que solo se seleccionen las columnas numéricas, el resultado es el siguiente:</p> <div class="codigo"> <p>titanic.select_dtypes(include = np.number).head()</p> </div> <p><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2021-01/python_0054.jpg"><img alt="Columnas numéricas del dataset Titanic" class="image-colorbox__max_800_px" data-entity-type="file" data-entity-uuid="insert-max_800_px-6fc744ae-1cd2-418e-a455-c3ec4a1369f5" data-insert-attach="{&quot;id&quot;: &quot;6fc744ae-1cd2-418e-a455-c3ec4a1369f5&quot;, &quot;attributes&quot;: {&quot;alt&quot;: [&quot;alt&quot;, &quot;description&quot;], &quot;title&quot;: [&quot;title&quot;]}}" data-insert-class="" data-insert-type="image" src="/sites/default/files/styles/max_800_px/public/2021-01/python_0054.jpg" /></a></p> </div> </div> </div> Fri, 15 Jan 2021 14:42:59 +0000 admin 2939 at https://interactivechaos.ovh Adición de elementos a un array NumPy https://interactivechaos.ovh/es/python/scenario/adicion-de-elementos-un-array-numpy <span class="field field--name-title field--type-string field--label-hidden">Adición de elementos a un array NumPy</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 22/06/2020 - 18:58</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Siempre llega el momento en el que tienes un array NumPy unidimensional al que quieres añadir un valor adicional (por ejemplo) y te das cuenta de que no es tan inmediato como parece.</p> <h3>La función np.concatenate()</h3> <p>La función <a href="https://numpy.org/doc/1.18/reference/generated/numpy.concatenate.html">np.concatenate()</a> nos permite "concatenar" dos arrays a lo largo de un cierto eje. Por ejemplo:</p> <div class="codigo"> <p>a = np.arange(4).reshape(2, 2)<br /> b = np.arange(10, 14).reshape(2, 2)</p> </div> <div class="codigo"> <p>a, b</p> </div> <div class="respuesta"> <p>(array([[0, 1],<br />         [2, 3]]),<br />  array([[10, 11],<br />         [12, 13]]))</p> </div> <p>Ahora, podemos concatenar ambas estructuras a lo largo de, por ejemplo, el eje horizontal:</p> <div class="codigo"> <p>np.concatenate([a, b], axis = 1)</p> </div> <div class="respuesta"> <p>array([[ 0,  1, 10, 11],<br />        [ 2,  3, 12, 13]])</p> </div> <p>Esto, llevado a nuestro escenario inicial que involucra un array unidimensional y un nuevo valor, supone que tendríamos que convertir el valor a array NumPy o a lista para poder realizar la concatenación. Así, si partimos del siguiente array:</p> <div class="codigo"> <p>a = np.array([1, 2, 3])</p> </div> <p>...y queremos añadir un 4 al final, podríamos conseguirlo con el siguiente código:</p> <div class="codigo"> <p>np.concatenate([a, [4]])</p> </div> <div class="respuesta"> <p>array([1, 2, 3, 4])</p> </div> <p>Obsérvese que la función exige una lista o tupla con las estructuras a concatenar y éstas podrían ser más de dos:</p> <div class="codigo"> <p>np.concatenate([a, [4], [5], [6]])</p> </div> <div class="respuesta"> <p>array([1, 2, 3, 4, 5, 6])</p> </div> <h3>La función np.append()</h3> <p>Otra opción un poco más simple es la ofrecida por la función <a href="https://numpy.org/doc/stable/reference/generated/numpy.append.html">np.append()</a>. En este caso, si el valor a añadir es un escalar, podemos pasar a la función simplemente el array y el escalar:</p> <div class="codigo"> <p>np.append(a, 4)</p> </div> <div class="respuesta"> <p>array([1, 2, 3, 4])</p> </div> <p>Si queremos añadir, no un escalar, sino varios, sí deberemos pasarlos como un único argumento convirtiéndolos en lista o en tupla (o en alguna estructura semejante):</p> <div class="codigo"> <p>np.append(a, [4, 5])</p> </div> <div class="respuesta"> <p>array([1, 2, 3, 4, 5])</p> </div> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Mon, 22 Jun 2020 16:58:50 +0000 admin 2151 at https://interactivechaos.ovh Inversión de un array NumPy https://interactivechaos.ovh/es/python/scenario/inversion-de-un-array-numpy <span class="field field--name-title field--type-string field--label-hidden">Inversión de un array NumPy</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 22/06/2020 - 15:42</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En ocasiones nos encontramos con que necesitamos invertir un array NumPy. Por ejemplo partimos del array:</p> <div class="codigo"> <p>numbers = np.array(["one", "two", "three", "four"])<br /> numbers</p> </div> <div class="respuesta"> <p>array(['one', 'two', 'three', 'four'], dtype='&lt;U5')</p> </div> <p>...y deseamos obtener el mismo array tras invertir sus elementos. Una opción es extraer los valores del array "hacia atrás":</p> <div class="codigo"> <p>numbers[::-1]</p> </div> <div class="respuesta"> <p>array(['four', 'three', 'two', 'one'], dtype='&lt;U5')</p> </div> <p>Con la anterior expresión estamos recorriendo todo el array (desde el índice 0 hasta el último) saltando de -1 en -1. El resultado es el deseado, como podemos ver.</p> <p>Otra opción es recurrir a la función <a href="https://numpy.org/doc/stable/reference/generated/numpy.flip.html">np.flip()</a>, que invierte los valores de un array a lo largo del eje que se indique. En nuestro ejemplo:</p> <div class="codigo"> <p>np.flip(numbers)</p> </div> <div class="respuesta"> <p>array(['four', 'three', 'two', 'one'], dtype='&lt;U5')</p> </div> <p>Si se tratase de un array de más de una dimensión, podemos usar el parámetro <em>axis</em> para especificar el eje deseado:</p> <div class="codigo"> <p>a = np.arange(9).reshape(3, -1)<br /> a</p> </div> <div class="respuesta"> <p>array([[0, 1, 2],<br />        [3, 4, 5],<br />        [6, 7, 8]])</p> </div> <p>Ahora, si especificamos el eje 0 (valor por defecto), la ordenación se realiza en el eje vertical:</p> <div class="codigo"> <p>np.flip(a, axis = 0)</p> </div> <div class="respuesta"> <p>array([[6, 7, 8],<br />        [3, 4, 5],<br />        [0, 1, 2]])</p> </div> <p>...y si especificamos el eje 1, la ordenación se realiza en el eje horizontal:</p> <div class="codigo"> <p>np.flip(a, axis = 1)</p> </div> <div class="respuesta"> <p>array([[2, 1, 0],<br />        [5, 4, 3],<br />        [8, 7, 6]])</p> </div></div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Mon, 22 Jun 2020 13:42:34 +0000 admin 2150 at https://interactivechaos.ovh Ordenación de un array NumPy según los valores de otro array https://interactivechaos.ovh/es/python/scenario/ordenacion-de-un-array-numpy-segun-los-valores-de-otro-array <span class="field field--name-title field--type-string field--label-hidden">Ordenación de un array NumPy según los valores de otro array</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 22/06/2020 - 15:31</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En este escenario partimos de un array NumPy que, en nuestro ejemplo, contiene nombres:</p> <div class="codigo"> <p>names = np.array(["Susana", "Jorge", "Alicia", "Alfonso"])</p> </div> <p>...y de otro array, de la misma longitud, que contiene, en este ejemplo, edades:</p> <div class="codigo"> <p>ages = np.array([53, 29, 33, 19])</p> </div> <p>El objetivo es ordenar el primer array, <em>names</em>, según los valores del segundo, <em>ages</em>. Para esto necesitamos usar la función <a href="https://numpy.org/doc/stable/reference/generated/numpy.argsort.html">np.argsort()</a>, que devuelve los índices de los valores de un array una vez ordenados. Por ejemplo, si pasamos a esta función nuestro array <em>ages</em>, el resultado es el siguiente:</p> <div class="codigo"> <p>np.argsort(ages)</p> </div> <div class="respuesta"> <p>array([3, 1, 2, 0], dtype=int64)</p> </div> <p>(la función anterior también está disponible como método).</p> <p>Es decir, estamos obteniendo las posiciones de las edades ordenadas -por defecto- de menor a mayor. Comprobamos que el menor valor es el situado en la posición 3 (la edad "19"), a continuación es el valor situado en la posición 1 (la edad "29"), etc.</p> <p>Si ahora pasamos el resultado anterior como índices a extraer del array <em>names</em>, el resultado es exactamente el buscado:</p> <div class="codigo"> <p>names[ages.argsort()]</p> </div> <div class="respuesta"> <p>array(['Alfonso', 'Jorge', 'Alicia', 'Susana'], dtype='&lt;U7')</p> </div> <p>Efectivamente Alfonso es la persona con menor edad (19), seguido de Jorge (29), etc.</p> <p>Si quisiéramos obtener los valores ordenados de mayor a menor, bastaría con darle la vuelta al array de edades:</p> <div class="codigo"> <p>names[ages[::-1].argsort()]</p> </div> <div class="respuesta"> <p>array(['Susana', 'Alicia', 'Jorge', 'Alfonso'], dtype='&lt;U7')</p> </div> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Mon, 22 Jun 2020 13:31:30 +0000 admin 2149 at https://interactivechaos.ovh Evaluación de la proximidad de los valores de dos arrays NumPy https://interactivechaos.ovh/es/python/scenario/evaluacion-de-la-proximidad-de-los-valores-de-dos-arrays-numpy <span class="field field--name-title field--type-string field--label-hidden">Evaluación de la proximidad de los valores de dos arrays NumPy</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Dom, 21/06/2020 - 19:59</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En ocasiones nos encontramos con la necesidad de comparar dos arrays NumPy cuyos valores son casi idénticos. Por ejemplo, supongamos que estamos trabajando con los dos siguientes arrays:</p> <div class="codigo"> <p>import numpy as np</p> </div> <div class="codigo"> <p>a = np.array([[2, 1], [0, 3]])<br /> a</p> </div> <div class="respuesta"> <p>array([[2, 1],<br />        [0, 3]])</p> </div> <div class="codigo"> <p>b = np.array([[1.999999999, 1], [0.0000000001, 2.99999999]])<br /> b</p> </div> <div class="respuesta"> <p>array([[2.00000000e+00, 1.00000000e+00],<br />        [1.00000000e-10, 2.99999999e+00]])</p> </div> <p>Es evidente que ambos arrays "son iguales", pudiendo ser las diferencias entre ellos derivadas de los métodos que se hayan obtenido para obtenerlos, llevando en un caso a valores enteros y en otro a números reales equivalentes.</p> <p>Sin embargo, si comparamos un array con otro usando los operadores de igualdad habituales o la función <a href="https://numpy.org/doc/stable/reference/generated/numpy.equal.html">np.equal()</a>, obtendremos como resultado que ambos arrays no son iguales:</p> <div class="codigo"> <p>np.equal(a, b)</p> </div> <div class="respuesta"> <p>array([[False,  True],<br />        [False, False]])</p> </div> <p>En casos como éste, la función <a href="https://numpy.org/doc/stable/reference/generated/numpy.allclose.html">np.allclose()</a> nos permite obtener la igualdad "aproximada" de los arrays siendo comparados:</p> <div class="codigo"> <p>np.allclose(a, b)</p> </div> <div class="respuesta">True</div> <p>Esta función admite dos parámetros (<strong>rtol</strong> y <strong>atol</strong>) que pueden ser usados para determinar la tolerancia relativa y absoluta respectivamente de la comparación.</p> <p>El parámetro <strong>equal_nan</strong> determina si los valores NaN -si existen y ocupan las mismas posiciones en ambos arrays- deberán considerarse iguales o no.</p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Sun, 21 Jun 2020 17:59:24 +0000 admin 2146 at https://interactivechaos.ovh División de un dataframe en bins definidos por una característica https://interactivechaos.ovh/es/python/scenario/division-de-un-dataframe-en-bins-definidos-por-una-caracteristica <span class="field field--name-title field--type-string field--label-hidden">División de un dataframe en bins definidos por una característica</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mar, 13/08/2019 - 09:54</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>El objetivo en este escenario es, partiendo de un dataframe, generar bins (bloques) definidos por los valores que tome una de las características y, a continuación, dividir el dataframe según estos bins.</p> <p>Veamos un ejemplo muy sencillo: Supongamos que estamos trabajando con el dataset <em>Iris</em> y queremos dividirlo en N grupos en función de los valores que tome la característica "<em>sepal_length</em>". Tendríamos que crear N bins basados en los valores de <em>sepal_length</em> y, a continuación, asignar cada registro del dataframe a uno de los bins.</p> <p>Para llevar esto a la práctica vamos a trabajar con apenas 5 registros del mencionado dataset <em>Iris</em>, y vamos a crear solo 2 bins: el primero cubrirá desde el valor más bajo de <em>sepal_length</em> hasta un valor intermedio de dicha columna, y el segundo desde el valor intermedio hasta el valor más elevado.</p> <p>Si los bins se generan con el mismo tamaño, ese valor intermedio sería -en nuestro caso- el valor medio. Es decir, si partimos de los valores 1, 1, 1 y 2, los dos bins serían [1, 1.5] y [1.5, 2] (olvidémonos por un momento de si el valor 1.5 pertenecería al primer o al segundo bin).</p> <p>Empecemos, en primer lugar, cargando el dataset iris y quedándonos solo con los primeros 5 registros:</p> <div class="codigo"> <p>import numpy as np<br /> import pandas as pd<br /> import seaborn as sns</p> </div> <div class="codigo"> <p>iris = sns.load_dataset("iris")<br /> iris = iris.head()<br /> iris.head()</p> </div> <img alt="5 primeros registros de Iris" data-entity-type="file" data-entity-uuid="83eddec9-08a5-4293-9d9a-cf89bfa341a9" src="/sites/default/files/inline-images/python-0001.png" class="align-center" width="438" height="178" loading="lazy" /><p>Mostramos -para poder hacer una comprobación visual- los valores mínimo y máximo de la columna <em>sepal_length</em>:</p> <div class="codigo"> <p>print("min: ", min(iris.sepal_length))<br /> print("max: ", max(iris.sepal_length))</p> </div> <img alt="Valores mínimo y máximo de sepal_length" data-entity-type="file" data-entity-uuid="3db49ed7-5077-4a51-a4f2-13034f54151f" src="/sites/default/files/inline-images/python-0002.png" class="align-center" width="433" height="45" loading="lazy" /><p>Ahora vamos a crear los bins. Para ello utilizaremos la función <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html" target="_blank">numpy.linspace()</a>, función que nos permite crear un conjunto de números equiespaciados entre dos dados. En nuestro ejemplo, los valores extremos vendrían definidos por el valor mínimo y máximo que acabamos de calcular:</p> <div class="codigo"> <p>bins = np.linspace(iris.sepal_length.min(), iris.sepal_length.max(), 3)<br /> bins</p> </div> <img alt="Bins creados con np.linspace()" data-entity-type="file" data-entity-uuid="d277a2fb-93f0-4411-89cf-a7a565d21ef9" src="/sites/default/files/inline-images/python-0003.png" class="align-center" width="436" height="28" loading="lazy" /><p>Es decir, el primer bin vendría definido por el intervalo [4.6, 4.85] y el segundo por el intervalo [4.85, 5.1]. La cuestión de si el valor intermedio pertenece a uno u otro bin dependerá de cómo asignemos los registros a cada uno de los bins. Una buena opción es utilizar la función <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html" target="_blank">numpy.digitize()</a>, que devuelve los índices de los bins a los que pertenece cada uno de los registros: Es decir, a esta función habría que pasar los valores a repartir en bins (la columna <em>sepal_length</em> en nuestro caso) y los bins (que hemos almacenado en la variable homónima), y devolvería una lista de índices, uno para cada registro, indicando a cuál de los bins pertenece cada uno. Hagamos una primera prueba:</p> <div class="codigo"> <p>i = np.digitize(iris.sepal_length, bins)<br /> i</p> </div> <img alt="Índices generados" data-entity-type="file" data-entity-uuid="f3f4b67f-e1cd-4023-8fa2-90621d585b3c" src="/sites/default/files/inline-images/python-0004.png" class="align-center" width="449" height="30" loading="lazy" /><p>Vemos, sin embargo, que se han asignado los registros no a 2 bins, sino a 3. La respuesta a esto la encontramos en la documentación de <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html" target="_blank">numpy.digitize()</a>: </p> <img alt="Documentación de numpy.digitize()" data-entity-type="file" data-entity-uuid="9217d23d-fb51-42ee-a026-12165f74fac8" src="/sites/default/files/inline-images/python-0005.png" class="align-center" width="498" height="168" loading="lazy" /><p>El menor valor (o el mayor, pues esto es configurable mediante el parámetro <em>right</em>) siempre va a tener un bin propio (pues los bins son cerrados o por la derecha o por la izquierda), que no es lo que queremos: queremos generar solo 2 bins, y que todos los registros se incluyan en estos bins.</p> <p>La solución es evitar que los valores mínimo y máximo a partir de los que se generan los bins coincidan con los valores mínimo y máximo de los datos a repartir en bins. Por ejemplo:</p> <div class="codigo"> <p>alpha = 0.0001<br /> bins = np.linspace(iris.sepal_length.min() - alpha, iris.sepal_length.max() + alpha, 3)<br /> bins</p> </div> <img alt="Generación de los bins" data-entity-type="file" data-entity-uuid="1b7b724c-92ff-46f4-99a6-03a6a5dc985e" src="/sites/default/files/inline-images/python-0006.png" class="align-center" width="417" height="27" loading="lazy" /><p>Ahora ninguno de los valores a repartir en los bins va a coincidir con los valores usados para generar los bins, por lo que todos deberían caer <strong>dentro</strong> de los bins. Comprobémoslo:</p> <div class="codigo"> <p>i = np.digitize(iris.sepal_length, bins)<br /> i</p> </div> <img alt="Índices a los bins" data-entity-type="file" data-entity-uuid="b9be1c24-1ed6-4be5-bb9a-2b68332a5df1" src="/sites/default/files/inline-images/python-0007.png" class="align-center" width="422" height="28" loading="lazy" /><p>Efectivamente, todos los índices apuntan a los dos bins que queríamos crear. Podemos comprobar visualmente que el primer valor de la columna <em>sepal_length</em> (5.1) que antes se incluía en su propio bin por ser el valor máximo ahora pertenece al bin 2 (el bin formado por los valores mayores o iguales a 4.85 y menores que 5.1001).</p> <p>Y ahora que hemos generado el índice del bin al que pertenece cada registro, podemos dividir el dataframe usando la función <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html" target="_blank">pandas.groupby()</a> para, por ejemplo, calcular el número de registros en cada bin:</p> <div class="codigo"> <p>iris.groupby(by = i).species.count()</p> </div> <img alt="Número de registros en cada bin" data-entity-type="file" data-entity-uuid="0b9be60b-3111-463a-81e6-e4c51454a398" src="/sites/default/files/inline-images/python-0008.png" class="align-center" width="410" height="62" loading="lazy" /><p>O calcular el valor medio del ancho del sépalo en cada bin:</p> <div class="codigo"> <p>iris.groupby(by = i).sepal_width.mean()</p> </div> <img alt="Valor medio del ancho del sépalo en cada bin" data-entity-type="file" data-entity-uuid="c173c7db-1801-4273-988f-ca9b474ffa0b" src="/sites/default/files/inline-images/python-0009.png" class="align-center" width="395" height="61" loading="lazy" /><p>Obsérvese que, en este caso, no estamos pasando al parámetro <em>by</em> el nombre de un campo (que es, probablemente, lo más frecuente) sino una lista de valores que pandas asocia a cada registro para determinar los grupos.</p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/pandas" hreflang="es">pandas</a></div> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Tue, 13 Aug 2019 07:54:10 +0000 admin 1208 at https://interactivechaos.ovh Comparación de dos arrays NumPy https://interactivechaos.ovh/es/python/scenario/comparacion-de-dos-arrays-numpy <span class="field field--name-title field--type-string field--label-hidden">Comparación de dos arrays NumPy</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 21/03/2019 - 15:30</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Podemos comparar dos arrays NumPy <strong>a</strong> y <strong>b</strong> del mismo tamaño con el operador igualdad (==):</p> <div class="codigo"> <p>a == b</p> </div> <p>Esto nos va a devolver un array del mismo tamaño que a y b formado por booleanos indicando si el elemento correspondiente coincide en ambos arrays:</p> <div class="codigo"> <p>a = np.array([[1, 2, 3], [2, 3, 4]])<br /> b = np.array([[1, 3, 3], [2, 3, 4]])</p> </div> <div class="codigo"> <p>a == b</p> </div> <img alt="Comparación de dos arrays NumPy" data-entity-type="file" data-entity-uuid="402f8fc1-da1d-4bbd-8356-84ac91e76cc9" src="/sites/default/files/inline-images/python_escenario_comp_arrays_np_01.JPG" class="align-center" width="373" height="46" loading="lazy" /><p>Si deseamos, no el detalle valor por valor, sino saber simplemente si todos los valores son iguales, basta aplicar el método <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html" target="_blank">all()</a> al resultado.</p> <div class="codigo"> <p>(a == b).all()</p> </div> <p>False</p> </div> <div class="field field--name-field-escenario-python-categoria field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/es/taxonomy/numpy" hreflang="es">NumPy</a></div> </div> </div> Thu, 21 Mar 2019 14:30:19 +0000 admin 887 at https://interactivechaos.ovh numpy.subtract https://interactivechaos.ovh/es/python/function/numpysubtract <span class="field field--name-title field--type-string field--label-hidden">numpy.subtract</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/es/user/1" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Lun, 25/02/2019 - 17:16</span> <div class="field field--name-field-fun-python-nombre-completo field--type-string field--label-above"> <div class="field__label">Nombre completo</div> <div class="field__item">numpy.subtract</div> </div> <div class="field field--name-field-libreria field--type-entity-reference field--label-above"> <div class="field__label">Librería</div> <div class="field__item">NumPy</div> </div> <div class="clearfix text-formatted field field--name-field-funcion-python-sintaxis field--type-text-long field--label-above"> <div class="field__label">Sintaxis</div> <div class="field__item"><p>numpy.subtract(x1, x2, dtype=None)</p></div> </div> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>La función <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.subtract.html" target="_blank">numpy.subtract</a> resta los valores de los dos arrays implicados, elemento a elemento. Si <strong>x1</strong> y <strong>x2</strong> son escalares, el resultado de la resta también será un escalar.</p> </div> </div> <div class="clearfix text-formatted field field--name-field-parametros field--type-text-long field--label-above"> <div class="field__label">Parámetros</div> <div class="field__item"><ul><li><strong>x1</strong>: Array NumPy cuyos valores serán considerados minuendos de la resta.</li> <li><strong>x2</strong>: Array NumPy cuyos valores serán considerados sustraendos de la resta.</li> <li><strong>dtype</strong>: Si se especifica, se asigna como tipo del array resultante, obviando el resultado del cálculo.</li> </ul></div> </div> <div class="clearfix text-formatted field field--name-field-ejemplos field--type-text-long field--label-above"> <div class="field__label">Ejemplos</div> <div class="field__items"> <div class="field__item"><p>Partimos de dos arrays, a y b, de dimensiones 3x3, definidos de la siguiente forma:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="c39cbe5f-6c8d-4b58-81a3-1f9a5e738480" src="/sites/default/files/inline-images/python_function_np_subtract_01.JPG" class="align-center" width="369" height="322" loading="lazy" /><p>Si restamos <strong>b</strong> de <strong>a</strong> usando la función <em>numpy.subtract</em>, el resultado es el siguiente:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="e58ac9fc-d10a-4af3-a9dc-a075a98cfb0f" src="/sites/default/files/inline-images/python_function_np_subtract_02.JPG" class="align-center" width="399" height="190" loading="lazy" /><p>Observamos como el tipo del array resultante es <em>int32</em>, igual que los arrays involucrados.</p> <p>Esta operación es semejante a <strong>a - b</strong>:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="99ea9fd2-ae1d-4d4a-a495-09f0b4a02950" src="/sites/default/files/inline-images/python_function_np_subtract_03.JPG" class="align-center" width="392" height="103" loading="lazy" /></div> <div class="field__item"><p>Siguiendo con el ejemplo anterior, si el array que juega el papel del sustraendo tiene las dimensiones de las filas del array que juega el papel del minuendo, el primero se resta de cada fila del segundo:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="8955d5d0-ffc5-4843-8c7b-f8af015d0904" src="/sites/default/files/inline-images/python_function_np_subtract_04.JPG" class="align-center" width="282" height="147" loading="lazy" /></div> <div class="field__item"><p>Si no es posible expandir el sustraendo para cubrir el minuendo, la función devuelve un error:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="1785936b-e786-4176-8721-2e786ed7420b" src="/sites/default/files/inline-images/python_function_np_subtract_05.JPG" class="align-center" width="677" height="245" loading="lazy" /></div> <div class="field__item"><p>Si especificamos el valor del argumento <em>dtype</em>, el array resultado de la substracción toma este valor:</p> <img alt="numpy.subtract" data-entity-type="file" data-entity-uuid="41e7ea77-1925-4a96-9ec3-15ee7bf5918d" src="/sites/default/files/inline-images/python_function_np_subtract_06.JPG" class="align-center" width="470" height="170" loading="lazy" /></div> </div> </div> Mon, 25 Feb 2019 16:16:05 +0000 admin 666 at https://interactivechaos.ovh