2

I know that other people are seeing similar errors (TypeError: Image data can not convert to float, TypeError: Image data can not convert to float using matplotlib, Type Error: Image data can not convert to float) but i don't see any solution there that helps me.

I'm trying to populate a numpy-array with floating point data and the plot it using imshow. The data in the Y-direction (almost) a Hermite polynomial and a Gaussian envelope, whereas the X-direction is just a Gaussian envelope.

from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt

####First we set Ne
Ne=25

###Set up a mesh with size sqrt(Ne) X sqrt(Ne)
sqrtNe=int(np.sqrt(Ne))
Ky=np.array(range(-sqrtNe,sqrtNe+1),dtype=float)
Kx=np.array(range(-sqrtNe,sqrtNe+1),dtype=float)
[KXmesh,KYmesh]=np.meshgrid(Kx,Ky,indexing='ij')

##X-direction is gussian envelope
AxMesh=np.exp(-(np.pi*KXmesh**2)/(4.0*Ne))

Nerror=21 ###This is where the error shows up
for n in range(Nerror,Ne):
    ##Y-direction is a polynomial of degree n ....
    AyMesh=0.0
    for i in range(n/2+1):
        AyMesh+=(-1)**i*(np.sqrt(2*np.pi)*2*KYmesh)**(n-2*i)/(np.math.factorial(n-2*i)*np.math.factorial(i))
    ### .... times a gaussian envelope
    AyMesh=AyMesh*np.exp(-np.pi*KYmesh**2)
    AyMesh=AyMesh/np.max(np.abs(AyMesh))
    WeightMesh=AyMesh*AxMesh
    print("n:",n)
    plt.figure()
    ####Error occurs here #####
    plt.imshow(WeightMesh,interpolation='nearest')
    plt.show(block=False)

When the code reaches the impow then i get the following error message

Traceback (most recent call last):
  File "FDOccupation_mimimal.py", line 30, in <module>
    plt.imshow(WeightMesh,interpolation='nearest')
  File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3022, in imshow
    **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/__init__.py", line 1814, in inner
    return func(ax, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_axes.py", line 4947, in imshow
    im.set_data(X)
  File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 449, in set_data
    raise TypeError("Image data can not convert to float")
TypeError: Image data can not convert to float

If i replace the code

AyMesh=0.0
for i in range(n/2+1):
    AyMesh+=(-1)**i*(np.sqrt(2*np.pi)*2*KYmesh)**(n-2*i)/(np.math.factorial(n-2*i)*np.math.factorial(i))
### .... times a gaussian envelope
AyMesh=AyMesh*np.exp(-np.pi*KYmesh**2)
AyMesh=AyMesh/np.max(np.abs(AyMesh))

with simply

AyMesh=KYmesh**n*np.exp(-np.pi*KYmesh**2)
AyMesh=AyMesh/np.max(np.abs(AyMesh))

the problem goes away!? Does anyone understand what is happening here?

1 Answer 1

7

For large values, np.math.factorial returns a long instead of an int. Arrays with long values are of dtype object as the cannot be stored using NumPy's types. You can re-convert the final result by

WeightMesh=np.array(AyMesh*AxMesh, dtype=float)

to have a proper float array.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.