diff --git a/pyopencl/array.py b/pyopencl/array.py
index 7f6f1cb599bacf966adb46c0c06ca2b5cfc90967..40187cb836c3c24cf3eff9d609bc952183839222 100644
--- a/pyopencl/array.py
+++ b/pyopencl/array.py
@@ -585,8 +585,14 @@ class Array:
         """
         :arg data: *None* means allocate a new array.
         """
+        fast = True
+        size = self.size
         if shape is None:
             shape = self.shape
+        else:
+            fast = False
+            size = None
+
         if dtype is None:
             dtype = self.dtype
         if strides is None:
@@ -605,14 +611,10 @@ class Array:
         else:
             events = self.events
 
-        if queue is not None:
-            return Array(queue, shape, dtype, allocator=allocator,
-                    strides=strides, data=data, offset=offset,
-                    events=events)
-        else:
-            return Array(self.context, shape, dtype,
-                    strides=strides, data=data, offset=offset,
-                    events=events, allocator=allocator)
+        return Array(None, shape, dtype, allocator=allocator,
+                strides=strides, data=data, offset=offset,
+                events=events,
+                _fast=fast, _context=self.context, _queue=queue, _size=size)
 
     def with_queue(self, queue):
         """Return a copy of *self* with the default queue set to *queue*.