# Creating a Uniform Grid#

Create a simple uniform grid from a 3D NumPy array of values.

```import numpy as np
import pyvista as pv
```

Take a 3D NumPy array of data values that holds some spatial data where each axis corresponds to the XYZ cartesian axes. This example will create a `pyvista.ImageData` that will hold the spatial reference for a 3D grid by which a 3D NumPy array of values can be plotted against.

Create the 3D NumPy array of spatially referenced data. This is spatially referenced such that the grid is `(20, 5, 10)`, `(nx, ny, nz)`.

```values = np.linspace(0, 10, 1000).reshape((20, 5, 10))
values.shape
```

Create the ImageData

```grid = pv.ImageData()
```

Set the grid dimensions to `shape + 1` because we want to inject our values on the CELL data.

```grid.dimensions = np.array(values.shape) + 1
```

Edit the spatial reference.

```grid.origin = (100, 33, 55.6)  # The bottom left corner of the data set
grid.spacing = (1, 5, 2)  # These are the cell sizes along each axis
```

Assign the data to the cell data. Be sure to flatten the data for `ImageData` objects using Fortran ordering.

```grid.cell_data["values"] = values.flatten(order="F")
grid
```

Now plot the grid!

```grid.plot(show_edges=True)
```

Don’t like cell data? You could also add the NumPy array to the point data of a `pyvista.ImageData`. Take note of the subtle difference when setting the grid dimensions upon initialization.

```# Create the 3D NumPy array of spatially referenced data again.
values = np.linspace(0, 10, 1000).reshape((20, 5, 10))
values.shape
```

Create the PyVista object and set the same attributes as earlier.

```grid = pv.ImageData()

# Set the grid dimensions to ``shape`` because we want to inject our values on
# the POINT data
grid.dimensions = values.shape

# Edit the spatial reference
grid.origin = (100, 33, 55.6)  # The bottom left corner of the data set
grid.spacing = (1, 5, 2)  # These are the cell sizes along each axis
```

Add the data values to the cell data

```grid.point_data["values"] = values.flatten(order="F")  # Flatten the array!
grid
```

Now plot the grid!

```grid.plot(show_edges=True)
```

## Exercise#

Now create your own `pyvista.ImageData` from a 3D NumPy array!

```help(pv.ImageData)
```

Generate example 3D data using `numpy.random.random()`. Feel free to use your own 3D numpy array here.

```arr = np.random.random((100, 100, 100))
arr.shape
```

Create the `pyvista.ImageData`.

Note

You will likely need to `ravel` the array with Fortran-ordering: `arr.ravel(order="F")`

```vol = pv.ImageData()
# Set attributes and data
...
```

Plot the ImageData

```vol.plot()
```

## Example#

PyVista has several examples that use `ImageData`.

See the PyVista documentation for further details on Volume Rendering

Here’s one of these example datasets:

```from pyvista import examples

```vol = pv.Wavelet()