x en lo siguiente tiene el valor:

[mpf('0.0') mpf('0.10000000000000001') mpf('0.20000000000000001')
 mpf('0.30000000000000004') mpf('0.40000000000000002') mpf('0.5')
 mpf('0.60000000000000009') mpf('0.70000000000000007')
 mpf('0.80000000000000004') mpf('0.90000000000000002')]

Código 1

import numpy as np
import mpmath as mp
import matplotlib.pyplot as plt

x = mp.arange(0,1,0.1)
y=x
plt.plot(x,y)
plt.show()

Todo esta bien

Código 2

import numpy as np
import mpmath as mp
import matplotlib.pyplot as plt

x = mp.arange(0,1,0.1)
y = 2.*x

plt.plot(x,y)
plt.show()

Se produce un error, dice: no se puede multiplicar la secuencia por no int del tipo 'float'. Entonces, en el código 3, cambio 2. a 2

Código 3

import numpy as np
import mpmath as mp
import matplotlib.pyplot as plt

x = mp.arange(0,1,0.1)
y = 2*x

plt.plot(x,y)
plt.show()

Esta vez dice: x e y deben tener la misma primera dimensión.

Finalmente, descubrí que puedo usar np.array para hacer que x sea una matriz, todo el problema desapareció.

Código 4

import numpy as np
import mpmath as mp
import matplotlib.pyplot as plt

x = mp.arange(0,1,0.1)
y = 2.*np.array(x)

plt.plot(x,y)
plt.show()

¿Puede alguien explicarme qué representa x, qué es mpf? ¿Por qué los códigos anteriores se comportan así? Si x no es una matriz numérica, ¿por qué puede usarse para trazar? Si es una matriz, ¿por qué no puede multiplicarse por un número? ¡Estoy muy confundido!

2
an offer can't refuse 11 dic. 2015 a las 15:07

4 respuestas

La mejor respuesta

Tu x es solo una lista:

>>> x = mp.arange(0, 1, 0.1)
>>> type(x)
list

Eso significa que obtienes el comportamiento normal de la lista:

>>> x * 2.0
TypeError: can't multiply sequence by non-int of type 'float'
>>> y = [e * 2.0 for e in x]

Esto se convierte en una matriz de objetos NumPy:

>>> np.array(x).dtype
dtype('O')

Esto significa que puede realizar operaciones basadas en elementos:

>>> np.array(x) * 2000.0
array([mpf('0.0'), mpf('200.0'), mpf('400.0'), mpf('600.00000000000011'),
       mpf('800.0'), mpf('1000.0'), mpf('1200.0000000000002'),
       mpf('1400.0000000000002'), mpf('1600.0'), mpf('1800.0')], d

plt.plot(x,y) puede usar listas o matrices NumPy como entrada.

1
Mike Müller 11 dic. 2015 a las 12:23

Mpmath proporciona sus propios tipos numéricos. La clase mpf se usará para flotación real (mpc para flotación compleja, etc.). Puede crear instancias de mph a partir de otros tipos de python como cadenas, enteros, flotantes y también desde otras instancias mpf. La precisión de una instancia de mpf será establecida por la precisión de trabajo global de mpmath.

Para obtener más información, visite Referencia de módulos SymPy

0
Roman Vogt 1 ene. 2018 a las 23:42

Mpf es una clase en la biblioteca mpmath para representar real float pero no es un int, ni flotante ...

En 1-2) ¿Has probado con y=mp.mpf(2).*x?

En 3) No he visto cómo se define la multiplicación de int con mpf, pero si funciona como con una cadena, entonces y en ese caso no tendría la misma dimensión. EDITAR: de hecho, 2*x me da la matriz extendida [x,x]

En 4) funciona, porque no estás usando números mpf, sino una matriz numpy, que tiene la operación de multiplicación definida como la escribiste.

1
tglaria 11 dic. 2015 a las 12:23

x es una matriz de mp - flotantes; El np.array que hizo de él se puede usar de una manera que una matriz normal de Python no puede.

0
Scott Hunter 11 dic. 2015 a las 12:17
34223207