diff --git a/CHANGES.rst b/CHANGES.rst
index bfd8523..4c17f4a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,10 @@
 Bug Fixes
 ^^^^^^^^^
 
+- Synchronize ``array_shape`` and ``pixel_shape`` attributes of WCS
+  objects. [#439]
+
+
 0.18.3 (2022-12-23)
 -------------------
 Bug Fixes
diff --git a/gwcs/api.py b/gwcs/api.py
index 9e5012f..e4fd19a 100644
--- a/gwcs/api.py
+++ b/gwcs/api.py
@@ -170,11 +170,17 @@ class GWCSAPIMixin(BaseHighLevelWCS, BaseLowLevelWCS):
         The shape should be given in ``(row, column)`` order (the convention
         for arrays in Python).
         """
-        return self._array_shape
+        if self._pixel_shape is None:
+            return None
+        else:
+            return self._pixel_shape[::-1]
 
     @array_shape.setter
     def array_shape(self, value):
-        self._array_shape = value
+        if value is None:
+            self._pixel_shape = None
+        else:
+            self._pixel_shape = value[::-1]
 
     @property
     def pixel_bounds(self):
diff --git a/gwcs/wcs.py b/gwcs/wcs.py
index 92a635c..3d09a34 100644
--- a/gwcs/wcs.py
+++ b/gwcs/wcs.py
@@ -141,7 +141,6 @@ class WCS(GWCSAPIMixin):
         self._available_frames = []
         self._pipeline = []
         self._name = name
-        self._array_shape = None
         self._initialize_wcs(forward_transform, input_frame, output_frame)
         self._pixel_shape = None
 

diff --git a/gwcs/tests/test_api.py b/gwcs/tests/test_api.py
index cae9bdd..5d1fa6c 100644
--- a/gwcs/tests/test_api.py
+++ b/gwcs/tests/test_api.py
@@ -327,6 +327,11 @@ def test_array_shape(wcsobj):
     wcsobj.array_shape = (2040, 1020)
     assert_array_equal(wcsobj.array_shape, (2040, 1020))
 
+    assert wcsobj.array_shape == wcsobj.pixel_shape[::-1]
+
+    wcsobj.pixel_shape = (1111, 2222)
+    assert wcsobj.array_shape == (2222, 1111)
+
 
 @wcs_objs
 def test_pixel_bounds(wcsobj):

APE 14 array_shape and pixel_shape should map to same private attribute
Currently WCS properties `array_shape` and `pixel_shape` set and retrieve independent private attributes.

https://github.com/spacetelescope/gwcs/blob/145778108aa6d7d0a220c96a179dc55d0a818e95/gwcs/api.py#L175-L177

and

https://github.com/spacetelescope/gwcs/blob/145778108aa6d7d0a220c96a179dc55d0a818e95/gwcs/api.py#L226-L237

But they are related:

```python
array_shape == pixel_shape[::-1]
```

for 2D images.  So really they should be setting the same underlying private attribute with the same validation.  Currently validation only happens for setting `pixel_shape`.

Finally, neither of these serializes when written out to ASDF.  We should probably add one or the other (both?) to the schema.

Brought about via discussion with @mcara.
gwcs/tests/test_api.py::test_array_shape[gwcs_2d_spatial_shift]
gwcs/tests/test_api.py::test_lowlevel_types[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_1d_freq] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_3d_identity_units] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_stokes_lookup] gwcs/tests/test_api.py::test_lowlevel_types[gwcs_3d_galactic_spectral] gwcs/tests/test_api.py::test_names[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_names[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_names[gwcs_1d_freq] gwcs/tests/test_api.py::test_names[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_names[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_names[gwcs_3d_identity_units] gwcs/tests/test_api.py::test_names[gwcs_stokes_lookup] gwcs/tests/test_api.py::test_names[gwcs_3d_galactic_spectral] gwcs/tests/test_api.py::test_pixel_n_dim[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_pixel_n_dim[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_pixel_n_dim[gwcs_1d_freq] gwcs/tests/test_api.py::test_pixel_n_dim[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_pixel_n_dim[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_world_n_dim[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_world_n_dim[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_world_n_dim[gwcs_1d_freq] gwcs/tests/test_api.py::test_world_n_dim[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_world_n_dim[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_world_axis_physical_types[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_world_axis_physical_types[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_world_axis_physical_types[gwcs_1d_freq] gwcs/tests/test_api.py::test_world_axis_physical_types[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_world_axis_physical_types[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_world_axis_units[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_world_axis_units[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_world_axis_units[gwcs_1d_freq] gwcs/tests/test_api.py::test_world_axis_units[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_world_axis_units[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_pixel_to_world_values[1-2] gwcs/tests/test_api.py::test_pixel_to_world_values[x1-y1] gwcs/tests/test_api.py::test_pixel_to_world_values_units_2d[1-2] gwcs/tests/test_api.py::test_pixel_to_world_values_units_2d[x1-y1] gwcs/tests/test_api.py::test_pixel_to_world_values_units_1d[1] gwcs/tests/test_api.py::test_pixel_to_world_values_units_1d[x1] gwcs/tests/test_api.py::test_array_index_to_world_values[1-2] gwcs/tests/test_api.py::test_array_index_to_world_values[x1-y1] gwcs/tests/test_api.py::test_world_axis_object_components_2d gwcs/tests/test_api.py::test_world_axis_object_components_2d_generic gwcs/tests/test_api.py::test_world_axis_object_components_1d gwcs/tests/test_api.py::test_world_axis_object_components_4d gwcs/tests/test_api.py::test_world_axis_object_classes_2d gwcs/tests/test_api.py::test_world_axis_object_classes_2d_generic gwcs/tests/test_api.py::test_world_axis_object_classes_4d gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_2d_spatial_reordered] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_1d_freq] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_3d_spatial_wave] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_4d_identity_units] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_3d_identity_units] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_stokes_lookup] gwcs/tests/test_api.py::test_high_level_wrapper[gwcs_3d_galactic_spectral] gwcs/tests/test_api.py::test_stokes_wrapper gwcs/tests/test_api.py::test_pixel_bounds[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_axis_correlation_matrix[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_serialized_classes[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_low_level_wcs[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_pixel_to_world[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_array_index_to_world[gwcs_2d_spatial_shift] gwcs/tests/test_api.py::test_pixel_to_world_quantity gwcs/tests/test_api.py::test_array_index_to_world_quantity gwcs/tests/test_api.py::test_world_to_pixel_quantity gwcs/tests/test_api.py::test_world_to_array_index_quantity gwcs/tests/test_api.py::test_world_to_pixel[0] gwcs/tests/test_api.py::test_world_to_pixel[1] gwcs/tests/test_api.py::test_world_to_array_index[0] gwcs/tests/test_api.py::test_world_to_array_index[1] gwcs/tests/test_api.py::test_world_to_pixel_values[0] gwcs/tests/test_api.py::test_world_to_pixel_values[1] gwcs/tests/test_api.py::test_world_to_array_index_values[0] gwcs/tests/test_api.py::test_world_to_array_index_values[1] gwcs/tests/test_api.py::test_ndim_str_frames gwcs/tests/test_api.py::test_composite_many_base_frame gwcs/tests/test_api.py::test_coordinate_frame_api