title: About "PIL" error, NameError: name 'PIL' is not defined
body: <p>I am a new python user and new one in "Stack Overflow", when I try to compile a tensorflow code I met some question, and I can't found answer from the website, so I want get some helps from here, thank everyone in advance! </p>
  
  <p>And this is my compiling result:</p>
  
  <pre><code>D:\Python\Anaconda2\envs\tensorflow\python.exe D:/Python/pycharm_project/test/mnist_chuji
  Traceback (most recent call last):
      File "D:/Python/pycharm_project/test/mnist_chuji", line 52, in &lt;module&gt;
        DisplayArray(u_init, rng=[-0.1, 0.1])
      File "D:/Python/pycharm_project/test/mnist_chuji", line 15, in DisplayArray
        PIL.Image.fromarray(a).save(f, fmt)
  NameError: name 'PIL' is not defined
  
  Process finished with exit code 1 
  </code></pre>
  
  <p>Here is my code, and I marked the line number that my errors happened to make you finding it easily:</p>
  
  <pre><code>#导入模拟仿真需要的库
  import tensorflow as tf
  import numpy as np
  
  #导入可视化需要的库
  from PIL import Image
  from io import StringIO #python3 使用了io代替了sStringIO
  from IPython.display import clear_output, Image, display
  
  def DisplayArray(a, fmt='jpeg', rng=[0,1]):
    """Display an array as a picture."""
    a = (a - rng[0])/float(rng[1] - rng[0])*255
    a = np.uint8(np.clip(a, 0, 255))
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt) #line 15
    display(Image(data=f.getvalue()))
  
  sess = tf.InteractiveSession()
  
  def make_kernel(a):
    """Transform a 2D array into a convolution kernel"""
    a = np.asarray(a)
    a = a.reshape(list(a.shape) + [1,1])
    return tf.constant(a, dtype=1)
  
  def simple_conv(x, k):
    """A simplified 2D convolution operation"""
    x = tf.expand_dims(tf.expand_dims(x, 0), -1)
    y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
    return y[0, :, :, 0]
  
  def laplace(x):
    """Compute the 2D laplacian of an array"""
    laplace_k = make_kernel([[0.5, 1.0, 0.5],
                             [1.0, -6., 1.0],
                             [0.5, 1.0, 0.5]])
    return simple_conv(x, laplace_k)
  
  N = 500
  
  # Initial Conditions -- some rain drops hit a pond
  
  # Set everything to zero
  u_init = np.zeros([N, N], dtype="float32")
  ut_init = np.zeros([N, N], dtype="float32")
  
  # Some rain drops hit a pond at random points
  for n in range(40):
    a,b = np.random.randint(0, N, 2)
    u_init[a,b] = np.random.uniform()
  
  DisplayArray(u_init, rng=[-0.1, 0.1]) #line 52
  
  # Parameters:
  # eps -- time resolution
  # damping -- wave damping
  eps = tf.placeholder(tf.float32, shape=())
  damping = tf.placeholder(tf.float32, shape=())
  
  # Create variables for simulation state
  U  = tf.Variable(u_init)
  Ut = tf.Variable(ut_init)
  
  # Discretized PDE update rules
  U_ = U + eps * Ut
  Ut_ = Ut + eps * (laplace(U) - damping * Ut)
  
  # Operation to update the state
  step = tf.group(
    U.assign(U_),
    Ut.assign(Ut_))
  
  # Initialize state to initial conditions
  tf.initialize_all_variables().run()
  
  # Run 1000 steps of PDE
  for i in range(1000):
    # Step simulation
    step.run({eps: 0.03, damping: 0.04})
    # Visualize every 50 steps
    if i % 50 == 0:
      clear_output()
      DisplayArray(U.eval(), rng=[-0.1, 0.1])
  </code></pre>
  
  <p>And I have install the pillow in my tensorflow environment(python 3.5.2).</p>
  
  <p>Thank you everyone very much!</p>