diff --git a/src/PIL/Image.py b/src/PIL/Image.py
--- a/src/PIL/Image.py
+++ b/src/PIL/Image.py
@@ -681,7 +681,7 @@ def _repr_png_(self):
             raise ValueError("Could not save to PNG for display") from e
         return b.getvalue()
 
-    def __array__(self):
+    def __array__(self, dtype=None):
         # numpy array interface support
         import numpy as np
 
@@ -700,7 +700,7 @@ def __array__(self):
         class ArrayData:
             __array_interface__ = new
 
-        return np.array(ArrayData())
+        return np.array(ArrayData(), dtype)
 
     def __getstate__(self):
         return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()]

diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py
--- a/Tests/test_image_array.py
+++ b/Tests/test_image_array.py
@@ -14,6 +14,10 @@ def test(mode):
         ai = numpy.array(im.convert(mode))
         return ai.shape, ai.dtype.str, ai.nbytes
 
+    def test_with_dtype(dtype):
+        ai = numpy.array(im, dtype=dtype)
+        assert ai.dtype == dtype
+
     # assert test("1") == ((100, 128), '|b1', 1600))
     assert test("L") == ((100, 128), "|u1", 12800)
 
@@ -27,6 +31,9 @@ def test(mode):
     assert test("RGBA") == ((100, 128, 4), "|u1", 51200)
     assert test("RGBX") == ((100, 128, 4), "|u1", 51200)
 
+    test_with_dtype(numpy.float64)
+    test_with_dtype(numpy.uint8)
+
     with Image.open("Tests/images/truncated_jpeg.jpg") as im_truncated:
         with pytest.raises(OSError):
             numpy.array(im_truncated)

Pillow 8.3 and NumPy
Throws exception with Pillow 8.3: `TypeError: __array__() takes 1 positional argument but 2 were given`

````python
with PIL.Image.open(filepath) as img:
    numpy.array( img, dtype=numpy.float32 )
````

What version of Python are you using? What version of numpy?
Same problem here.
Python 3.7.4
numpy 1.21.0

workaround:
```python
with PIL.Image.open(filepath) as img:
    numpy.array(img).astype(np.float32)
```
Works with just about anything. The problem is that pillow newly implemented `__array__`, but only without arguments. Numpy requires `__array__` to take an optional dtype argument. This is used e.g. by numpy.array when the user passes a dtype argument. This should be with just about any numpy/python version.
fails with python 3.8 + 3.9, numpy 1.20 + 1.21
I'll send a patch.
We are seeing errors in `3.{6,7,8,9}`
Same issue in https://github.com/hyperspy/hyperspy/runs/2961516889 for all python version >=3.6 using the `imageio` library:

```python
                # Apply palette
>               frame_paletted = np.array(im, np.uint8)
E               TypeError: __array__() takes 1 positional argument but 2 were given

/opt/hostedtoolcache/Python/3.9.5/x64/lib/python3.9/site-packages/imageio/plugins/pillow.py:745: TypeError
```

The python 3.6 build is with numpy 1.17.1