Números de base N y su precisión.

Todos los sistemas numéricos posicionales (números de base-N) comparten el mismo problema de  precisión

La mayoría de los lenguajes de programación, se basan en el estándar IEEE 754.

La cuestión,  es que los números se representan en este formato como un número entero multiplicado por una potencia de dos; los números racionales (como 0.1, que es 1/10) cuyo denominador no es una potencia de dos, no se pueden representar de forma exacta.

Para 0.1 en el formato estándar binario64, la representación se puede escribir en decimal exactamente como 0.1000000000000000055511151231257827021181583404541015625, o 0x1.999999999999ap-4 en notación C99 hexfloat.

Sin embargo, el número racional 0.1, que es 1/10, se puede escribir exactamente como 0,1 en decimal, o 0x1.99999999999999 … p-4, en un análogo de la notación hexfloat C99, donde … representa una secuencia interminable de 9.

Las constantes 0.2 y 0.3  por ejemplo, también tendrán aproximaciones a sus valores verdaderos.

Pero sucede que el doble más cercano a 0.2 es mayor que el número racional 0.2, mientras  que el doble más cercano a 0.3 es menor que el número racional 0.3.

La suma de 0.1 y 0.2 termina siendo mayor que el número racional 0.3.

Un tratamiento bastante completo de las cuestiones de la aritmética de coma flotante puede leerse en What Every Computer Scientist Should Know About Floating-Point Arithmetic, o en floating-point-gui.de, ambos en ingles.

Los números decimales con base 10, tienen los mismos problemas, por ejemplo  números como 1/3 terminan como 0.333333333 .

En la práctica, este problema de precisión significa que se necesita usar funciones de redondeo para redondear sus números de coma flotante a la cantidad de decimales que le interesen antes de mostrarlos.

También debe reemplazar las pruebas de igualdad con comparaciones que permitan cierta tolerancia, lo que significa:

No hacer si (x == y) {...}

En su lugar, haga if (abs (x - y) <mi valor de tolerancia) {...}.

Donde abs es el valor absoluto.,mi valor de tolerancia es un valor que eliges  para tu aplicación,  ( no debe ser una constante de estilo «épsilon») y tendrá mucho que ver con el «margen de maniobra» que estés dispuesto a permitir y cuál será el número más grande que va a comparar.

Mas de cien pupilas, donde vernos vivos …..

J. Sabina

Diferencia entre json.load() y json.loads()

logo python

La diferencia entre json.load() y json.loads(), puede a menudo confundirnos cuando operamos con archivos json desde Python.

He aquí en que se diferencian:

json.load(): deserializa el archivo json, tomando como cadena (string), su contenido y soporta texto y binario, para convertirlo en un objeto Python, siguiendo esta tabla de conversión

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone
tabla de conversion de datos json python

json.load()

deserializa el archivo en si mismo, ya que acepta el objeto file(archivo), por tanto acepta esta forma

with open("/abc/data.json", "r") as content:
print(json.load(content))

Esto no podríamos hacerlo con json.loads(), porque lanzaría un error del tipo:

TypeError: expected string or buffer

json.loads()

Deserializa un string, por tanto al usarlo deberíamos pasarle  el contenido del archivo empleando, por ejemplo read().

with open("json_data.json", "r") as content:
print(json.loads(content.read()))

Esto se debe, a que al emplear la función read(), estamos leyendo el contenido de la cadena o string,  y no el archivo como objeto.

Si intentaramos emplear json.load(), para deserializar solo el contenido obtendríamos este error:

with open("json_data.json", "r") as content:
print(json.load(content.read()))
AttributeError: 'str' object has no attribute 'read'

En este link dejo especificaciones sobre su sintaxis

Dicho de otro modo json.load() deserializa archivos y json.loads() deserializa strings.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

…. hay que levantarse cada mañana con una esperanza y dormirse cada noche con una meta….

linspace logspace y ravel en python

logo python

Dentro de la librería Numpy, existen múltiples métodos para crear arrays. Tres  de ellas, que habrán visto en algún momento, son linspace logspace y ravel.

En este post explicaré rápidamente su empleo.

linspace()

Su sintaxis es :

numpy.linspace(valor-inicial, valor-final, número de valores, valor-final-a-incluir, tipo de valor)

Crea un array, que estará formado por una cantidad de valores dada y que quedará equiespaciada dentro de los limites dados, o sea el valor inicial y el valor final.

Los tres parámetros primeros son obligatorios, los dos restantes opcionales.

El valor final por defecto, queda incluido en el array, pero puede ser configurado, para lo contrario, en el parámetro valor final a incluir, que asimila valores True o False

a = np.linspace(1, 4, 4)
a
array([1., 2., 3., 4.])

linspace()

Asimila especificaciones, como el tipo de dato en su ultimo parámetro, que añade dtype():

a = np.linspace(1, 4, 4 dtype = "int")
a
array([1, 2, 3, 4])
print(a.dtype)
print(a.shape)
int32 (4,)

logspace()

Funciona de forma muy parecida a linspace(), pero la escala de valores del array es logaritmica:

b = np.logspace(2, 3, 10)
b
La función numpy.logspace

Como ultimo elemento, decir que logspace() aplica por defecto base 10 en el algoritmo pero puede ser modificado.

ravel()

devuelve una matriz ( de una sola dimensión) contigua aplanada, que posee todos los elementos del mismo tipo que esta.

Su sintaxis es

numpy.ravel(array, order = 'C')
array : [array_like]array de entrada
order : [C-contiguous, F-contiguous, A-contiguous; optional]         

C-contiguous. Es el  orden contiguo en memoria (el ultimo índice, en este caso, varia mas rapido)

El orden C significa que operar el aumento de fila en la matriz será un poco más rápido

El orden F (FORTRAN) indica que en la memoria (el primer índice varía más rápido). Significa que las operaciones en columnas serán más rápidas.

Diferencias entre. flatten y ravel

«A» significa leer / escribir los elementos en un orden de índice similar a Fortran,  si la matriz es Fortran contigua en la memoria, de lo contrario será orden C.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

“…… justo todo lo que nos hace diferentes y superiores, nos hace peor y débiles: el oxigeno, la mente, la palabra y un corto e inútil etc”

Y

Indicar el separador en archivo csv en Mac, con Python(sep).

logo python

Ante todo, esta es una solución para personas que trabajen en Mac con Python y la librería Pandas, para no programadores, la solución es otra.

Un problema común, es que al crear un archivo csv, cometamos una equivocación y nuestro archivo no se visualice correctamente, lo que nos traerá problemas, sí como es mi caso quiero emplearlo como dataset en Python.

Digamos que tengo un archivo del tipo  Excel, con dos columnas «vendedores» y «ventas».

La columna «vendedores» tiene valores enteros, y la columna «ventas», valores decimales.

La dificultad a la que nos enfrentamos es que en Mac, para cambiar el separador hay que ir hasta el propio registro que establece los separadores decimales, de todo el sistema, ya sea directamente o mediante comandos(solución para no programadores).

Siendo como soy, enemigo de tocar lo que no debo tocar, para evitar errores futuros de los cuales olvidaré la causa, busqué una solución más sencilla, que ya existe en el «abc» de Pandas. El argumento sep().

Cuando creaba un csv, ya sea en formato UTF 8, o csv para Mac,  lo que hacia era separarme las filas por , coma y no punto y coma.

Pandas resuelve esto fácilmente, con él parámetro sep(), que permite escoger el separador en una cadena dada.

Veremos la salida del mismo archivo dos veces, sin utilizar sep y dándole uso.

Sin usar sep

 Utilizando sep

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Y yo tenia respuesta a todas sus preguntas, incluso a las que aún no se ha hecho.

Y
Translate »