diff --git a/dask/array/core.py b/dask/array/core.py
index 64405e95c..e4dfaf8d3 100644
--- a/dask/array/core.py
+++ b/dask/array/core.py
@@ -847,7 +847,7 @@ class Array(Base):
         >>> da.ones((10, 10), chunks=(5, 5), dtype='i4')
         dask.array<..., shape=(10, 10), dtype=int32, chunksize=(5, 5)>
         """
-        chunksize = str(tuple(c[0] for c in self.chunks))
+        chunksize = str(tuple(c[0] if c else 0 for c in self.chunks))
         name = self.name if len(self.name) < 10 else self.name[:7] + '...'
         return ("dask.array<%s, shape=%s, dtype=%s, chunksize=%s>" %
                 (name, self.shape, self._dtype, chunksize))
@@ -3030,7 +3030,7 @@ def concatenate3(arrays):
     if not ndim:
         return arrays
     if not arrays:
-        return np.empty(())
+        return np.empty(0)
     chunks = chunks_from_arrays(arrays)
     shape = tuple(map(sum, chunks))
 
diff --git a/dask/array/linalg.py b/dask/array/linalg.py
index 341263f77..d8a5d362f 100644
--- a/dask/array/linalg.py
+++ b/dask/array/linalg.py
@@ -741,7 +741,7 @@ def lstsq(a, b):
     q, r = qr(a)
     x = solve_triangular(r, q.T.dot(b))
     residuals = b - a.dot(x)
-    residuals = (residuals ** 2).sum()
+    residuals = (residuals ** 2).sum(keepdims=True)
 
     token = tokenize(a, b)
 
diff --git a/dask/array/reductions.py b/dask/array/reductions.py
index dcde63c06..28c7cb4af 100644
--- a/dask/array/reductions.py
+++ b/dask/array/reductions.py
@@ -29,9 +29,9 @@ def reduction(x, chunk, aggregate, axis=None, keepdims=None, dtype=None,
         axis = (axis,)
     axis = tuple(i if i >= 0 else x.ndim + i for i in axis)
 
-    if dtype and 'dtype' in getargspec(chunk).args:
+    if dtype is not None and 'dtype' in getargspec(chunk).args:
         chunk = partial(chunk, dtype=dtype)
-    if dtype and 'dtype' in getargspec(aggregate).args:
+    if dtype is not None and 'dtype' in getargspec(aggregate).args:
         aggregate = partial(aggregate, dtype=dtype)
 
     # Map chunk across all blocks
diff --git a/dask/array/utils.py b/dask/array/utils.py
index 79f5b7436..f7b896c30 100644
--- a/dask/array/utils.py
+++ b/dask/array/utils.py
@@ -1,3 +1,4 @@
+from distutils.version import LooseVersion
 import difflib
 import os
 import numpy as np
@@ -5,15 +6,47 @@ import numpy as np
 from .core import Array
 from ..async import get_sync
 
+if LooseVersion(np.__version__) >= '1.10.0':
+    allclose = np.allclose
+else:
+    def allclose(a, b, **kwargs):
+        if kwargs.pop('equal_nan', False):
+            a_nans = np.isnan(a)
+            b_nans = np.isnan(b)
+            if not (a_nans == b_nans).all():
+                return False
+            a = a[~a_nans]
+            b = b[~b_nans]
+        return np.allclose(a, b, **kwargs)
+
+
+def _not_empty(x):
+    return x.shape and 0 not in x.shape
+
+
+def _maybe_check_dtype(a, dtype=None):
+    # Only check dtype matches for non-empty
+    if _not_empty(a):
+        assert a.dtype == dtype
+
+
 def assert_eq(a, b, **kwargs):
     if isinstance(a, Array):
         adt = a._dtype
         a = a.compute(get=get_sync)
+        if adt is not None:
+            _maybe_check_dtype(a, adt)
+        else:
+            adt = getattr(a, 'dtype', None)
     else:
         adt = getattr(a, 'dtype', None)
     if isinstance(b, Array):
         bdt = b._dtype
         b = b.compute(get=get_sync)
+        if bdt is not None:
+            _maybe_check_dtype(b, bdt)
+        else:
+            bdt = getattr(b, 'dtype', None)
     else:
         bdt = getattr(b, 'dtype', None)
 
@@ -23,7 +56,10 @@ def assert_eq(a, b, **kwargs):
                              os.linesep.join(diff))
 
     try:
-        assert np.allclose(a, b, **kwargs)
+        if _not_empty(a) and _not_empty(b):
+            # Treat all empty arrays as equivalent
+            assert a.shape == b.shape
+            assert allclose(a, b, **kwargs)
         return
     except TypeError:
         pass

dask.array's mean converts float32 to float64 at compute time
Originally reported by @robintw in pydata/xarray#913:
```
import dask.array as da
import numpy as np

x = da.from_array(np.random.rand(10, 10).astype(np.float32), (5, 5)).mean(axis=0)
print(x.dtype)  # float32
print(x.compute().dtype)  # float64
```
Tested on dask 0.10.1.
diff --git a/dask/array/tests/test_array_core.py b/dask/array/tests/test_array_core.py
index e1288b5ae..3db7be7e7 100644
--- a/dask/array/tests/test_array_core.py
+++ b/dask/array/tests/test_array_core.py
@@ -804,7 +804,10 @@ def test_repr():
     assert str(d._dtype) in repr(d)
     d = da.ones((4000, 4), chunks=(4, 2))
     assert len(str(d)) < 1000
-
+    # Empty array
+    d = da.Array({}, 'd', ((), (3, 4)), dtype='i8')
+    assert str(d.shape) in repr(d)
+    assert str(d._dtype) in repr(d)
 
 def test_slicing_with_ellipsis():
     x = np.arange(256).reshape((4, 4, 4, 4))
diff --git a/dask/array/tests/test_reductions.py b/dask/array/tests/test_reductions.py
index 7da0b98e2..bee68e1d7 100644
--- a/dask/array/tests/test_reductions.py
+++ b/dask/array/tests/test_reductions.py
@@ -4,6 +4,7 @@ import pytest
 pytest.importorskip('numpy')
 
 import dask.array as da
+from dask.array.utils import assert_eq as _assert_eq
 from dask.core import get_deps
 from dask.context import set_options
 
@@ -16,15 +17,8 @@ except ImportError:  # pragma: no cover
     nanprod = npcompat.nanprod
 
 
-def eq(a, b):
-    if isinstance(a, da.Array):
-        a = a.compute()
-    if isinstance(b, da.Array):
-        b = b.compute()
-    if isinstance(a, (np.generic, np.ndarray)):
-        return np.all(np.isclose(a, b, equal_nan=True))
-    else:
-        return a == b
+def assert_eq(a, b):
+    _assert_eq(a, b, equal_nan=True)
 
 
 def same_keys(a, b):
@@ -37,21 +31,21 @@ def same_keys(a, b):
 
 
 def reduction_1d_test(da_func, darr, np_func, narr, use_dtype=True, split_every=True):
-    assert eq(da_func(darr), np_func(narr))
-    assert eq(da_func(darr, keepdims=True), np_func(narr, keepdims=True))
+    assert_eq(da_func(darr), np_func(narr))
+    assert_eq(da_func(darr, keepdims=True), np_func(narr, keepdims=True))
     assert same_keys(da_func(darr), da_func(darr))
     assert same_keys(da_func(darr, keepdims=True), da_func(darr, keepdims=True))
     if use_dtype:
-        assert eq(da_func(darr, dtype='f8'), np_func(narr, dtype='f8'))
-        assert eq(da_func(darr, dtype='i8'), np_func(narr, dtype='i8'))
+        assert_eq(da_func(darr, dtype='f8'), np_func(narr, dtype='f8'))
+        assert_eq(da_func(darr, dtype='i8'), np_func(narr, dtype='i8'))
         assert same_keys(da_func(darr, dtype='i8'), da_func(darr, dtype='i8'))
     if split_every:
         a1 = da_func(darr, split_every=2)
         a2 = da_func(darr, split_every={0: 2})
         assert same_keys(a1, a2)
-        assert eq(a1, np_func(narr))
-        assert eq(a2, np_func(narr))
-        assert eq(da_func(darr, keepdims=True, split_every=2),
+        assert_eq(a1, np_func(narr))
+        assert_eq(a2, np_func(narr))
+        assert_eq(da_func(darr, keepdims=True, split_every=2),
                   np_func(narr, keepdims=True))
 
 
@@ -81,34 +75,34 @@ def test_reductions_1D(dtype):
 
 def reduction_2d_test(da_func, darr, np_func, narr, use_dtype=True,
                       split_every=True):
-    assert eq(da_func(darr), np_func(narr))
-    assert eq(da_func(darr, keepdims=True), np_func(narr, keepdims=True))
-    assert eq(da_func(darr, axis=0), np_func(narr, axis=0))
-    assert eq(da_func(darr, axis=1), np_func(narr, axis=1))
-    assert eq(da_func(darr, axis=1, keepdims=True),
+    assert_eq(da_func(darr), np_func(narr))
+    assert_eq(da_func(darr, keepdims=True), np_func(narr, keepdims=True))
+    assert_eq(da_func(darr, axis=0), np_func(narr, axis=0))
+    assert_eq(da_func(darr, axis=1), np_func(narr, axis=1))
+    assert_eq(da_func(darr, axis=1, keepdims=True),
               np_func(narr, axis=1, keepdims=True))
-    assert eq(da_func(darr, axis=(1, 0)), np_func(narr, axis=(1, 0)))
+    assert_eq(da_func(darr, axis=(1, 0)), np_func(narr, axis=(1, 0)))
 
     assert same_keys(da_func(darr, axis=1), da_func(darr, axis=1))
     assert same_keys(da_func(darr, axis=(1, 0)), da_func(darr, axis=(1, 0)))
 
     if use_dtype:
-        assert eq(da_func(darr, dtype='f8'), np_func(narr, dtype='f8'))
-        assert eq(da_func(darr, dtype='i8'), np_func(narr, dtype='i8'))
+        assert_eq(da_func(darr, dtype='f8'), np_func(narr, dtype='f8'))
+        assert_eq(da_func(darr, dtype='i8'), np_func(narr, dtype='i8'))
 
     if split_every:
         a1 = da_func(darr, split_every=4)
         a2 = da_func(darr, split_every={0: 2, 1: 2})
         assert same_keys(a1, a2)
-        assert eq(a1, np_func(narr))
-        assert eq(a2, np_func(narr))
-        assert eq(da_func(darr, keepdims=True, split_every=4),
+        assert_eq(a1, np_func(narr))
+        assert_eq(a2, np_func(narr))
+        assert_eq(da_func(darr, keepdims=True, split_every=4),
                   np_func(narr, keepdims=True))
-        assert eq(da_func(darr, axis=0, split_every=2), np_func(narr, axis=0))
-        assert eq(da_func(darr, axis=0, keepdims=True, split_every=2),
+        assert_eq(da_func(darr, axis=0, split_every=2), np_func(narr, axis=0))
+        assert_eq(da_func(darr, axis=0, keepdims=True, split_every=2),
                   np_func(narr, axis=0, keepdims=True))
-        assert eq(da_func(darr, axis=1, split_every=2), np_func(narr, axis=1))
-        assert eq(da_func(darr, axis=1, keepdims=True, split_every=2),
+        assert_eq(da_func(darr, axis=1, split_every=2), np_func(narr, axis=1))
+        assert_eq(da_func(darr, axis=1, keepdims=True, split_every=2),
                   np_func(narr, axis=1, keepdims=True))
 
 
@@ -146,24 +140,24 @@ def test_arg_reductions(dfunc, func):
     x = np.random.random((10, 10, 10))
     a = da.from_array(x, chunks=(3, 4, 5))
 
-    assert eq(dfunc(a), func(x))
-    assert eq(dfunc(a, 0), func(x, 0))
-    assert eq(dfunc(a, 1), func(x, 1))
-    assert eq(dfunc(a, 2), func(x, 2))
+    assert_eq(dfunc(a), func(x))
+    assert_eq(dfunc(a, 0), func(x, 0))
+    assert_eq(dfunc(a, 1), func(x, 1))
+    assert_eq(dfunc(a, 2), func(x, 2))
     with set_options(split_every=2):
-        assert eq(dfunc(a), func(x))
-        assert eq(dfunc(a, 0), func(x, 0))
-        assert eq(dfunc(a, 1), func(x, 1))
-        assert eq(dfunc(a, 2), func(x, 2))
+        assert_eq(dfunc(a), func(x))
+        assert_eq(dfunc(a, 0), func(x, 0))
+        assert_eq(dfunc(a, 1), func(x, 1))
+        assert_eq(dfunc(a, 2), func(x, 2))
 
     pytest.raises(ValueError, lambda: dfunc(a, 3))
     pytest.raises(TypeError, lambda: dfunc(a, (0, 1)))
 
     x2 = np.arange(10)
     a2 = da.from_array(x2, chunks=3)
-    assert eq(dfunc(a2), func(x2))
-    assert eq(dfunc(a2, 0), func(x2, 0))
-    assert eq(dfunc(a2, 0, split_every=2), func(x2, 0))
+    assert_eq(dfunc(a2), func(x2))
+    assert_eq(dfunc(a2, 0), func(x2, 0))
+    assert_eq(dfunc(a2, 0, split_every=2), func(x2, 0))
 
 
 @pytest.mark.parametrize(['dfunc', 'func'],
@@ -172,8 +166,8 @@ def test_nanarg_reductions(dfunc, func):
     x = np.random.random((10, 10, 10))
     x[5] = np.nan
     a = da.from_array(x, chunks=(3, 4, 5))
-    assert eq(dfunc(a), func(x))
-    assert eq(dfunc(a, 0), func(x, 0))
+    assert_eq(dfunc(a), func(x))
+    assert_eq(dfunc(a, 0), func(x, 0))
     with pytest.raises(ValueError):
         dfunc(a, 1).compute()
 
@@ -212,18 +206,18 @@ def test_reductions_2D_nans():
     reduction_2d_test(da.nanmin, a, np.nanmin, x, False, False)
     reduction_2d_test(da.nanmax, a, np.nanmax, x, False, False)
 
-    assert eq(da.argmax(a), np.argmax(x))
-    assert eq(da.argmin(a), np.argmin(x))
-    assert eq(da.nanargmax(a), np.nanargmax(x))
-    assert eq(da.nanargmin(a), np.nanargmin(x))
-    assert eq(da.argmax(a, axis=0), np.argmax(x, axis=0))
-    assert eq(da.argmin(a, axis=0), np.argmin(x, axis=0))
-    assert eq(da.nanargmax(a, axis=0), np.nanargmax(x, axis=0))
-    assert eq(da.nanargmin(a, axis=0), np.nanargmin(x, axis=0))
-    assert eq(da.argmax(a, axis=1), np.argmax(x, axis=1))
-    assert eq(da.argmin(a, axis=1), np.argmin(x, axis=1))
-    assert eq(da.nanargmax(a, axis=1), np.nanargmax(x, axis=1))
-    assert eq(da.nanargmin(a, axis=1), np.nanargmin(x, axis=1))
+    assert_eq(da.argmax(a), np.argmax(x))
+    assert_eq(da.argmin(a), np.argmin(x))
+    assert_eq(da.nanargmax(a), np.nanargmax(x))
+    assert_eq(da.nanargmin(a), np.nanargmin(x))
+    assert_eq(da.argmax(a, axis=0), np.argmax(x, axis=0))
+    assert_eq(da.argmin(a, axis=0), np.argmin(x, axis=0))
+    assert_eq(da.nanargmax(a, axis=0), np.nanargmax(x, axis=0))
+    assert_eq(da.nanargmin(a, axis=0), np.nanargmin(x, axis=0))
+    assert_eq(da.argmax(a, axis=1), np.argmax(x, axis=1))
+    assert_eq(da.argmin(a, axis=1), np.argmin(x, axis=1))
+    assert_eq(da.nanargmax(a, axis=1), np.nanargmax(x, axis=1))
+    assert_eq(da.nanargmin(a, axis=1), np.nanargmin(x, axis=1))
 
 
 def test_moment():
@@ -234,30 +228,30 @@ def test_moment():
     # Poorly conditioned
     x = np.array([1., 2., 3.]*10).reshape((3, 10)) + 1e8
     a = da.from_array(x, chunks=5)
-    assert eq(a.moment(2), moment(x, 2))
-    assert eq(a.moment(3), moment(x, 3))
-    assert eq(a.moment(4), moment(x, 4))
+    assert_eq(a.moment(2), moment(x, 2))
+    assert_eq(a.moment(3), moment(x, 3))
+    assert_eq(a.moment(4), moment(x, 4))
 
     x = np.arange(1, 122).reshape((11, 11)).astype('f8')
     a = da.from_array(x, chunks=(4, 4))
-    assert eq(a.moment(4, axis=1), moment(x, 4, axis=1))
-    assert eq(a.moment(4, axis=(1, 0)), moment(x, 4, axis=(1, 0)))
+    assert_eq(a.moment(4, axis=1), moment(x, 4, axis=1))
+    assert_eq(a.moment(4, axis=(1, 0)), moment(x, 4, axis=(1, 0)))
 
     # Tree reduction
-    assert eq(a.moment(order=4, split_every=4), moment(x, 4))
-    assert eq(a.moment(order=4, axis=0, split_every=4), moment(x, 4, axis=0))
-    assert eq(a.moment(order=4, axis=1, split_every=4), moment(x, 4, axis=1))
+    assert_eq(a.moment(order=4, split_every=4), moment(x, 4))
+    assert_eq(a.moment(order=4, axis=0, split_every=4), moment(x, 4, axis=0))
+    assert_eq(a.moment(order=4, axis=1, split_every=4), moment(x, 4, axis=1))
 
 
 def test_reductions_with_negative_axes():
     x = np.random.random((4, 4, 4))
     a = da.from_array(x, chunks=2)
 
-    assert eq(a.argmin(axis=-1), x.argmin(axis=-1))
-    assert eq(a.argmin(axis=-1, split_every=2), x.argmin(axis=-1))
+    assert_eq(a.argmin(axis=-1), x.argmin(axis=-1))
+    assert_eq(a.argmin(axis=-1, split_every=2), x.argmin(axis=-1))
 
-    assert eq(a.sum(axis=-1), x.sum(axis=-1))
-    assert eq(a.sum(axis=(0, -1)), x.sum(axis=(0, -1)))
+    assert_eq(a.sum(axis=-1), x.sum(axis=-1))
+    assert_eq(a.sum(axis=(0, -1)), x.sum(axis=(0, -1)))
 
 
 def test_nan():
@@ -266,16 +260,16 @@ def test_nan():
                   [9, 10, 11, 12]])
     d = da.from_array(x, chunks=(2, 2))
 
-    assert eq(np.nansum(x), da.nansum(d))
-    assert eq(np.nansum(x, axis=0), da.nansum(d, axis=0))
-    assert eq(np.nanmean(x, axis=1), da.nanmean(d, axis=1))
-    assert eq(np.nanmin(x, axis=1), da.nanmin(d, axis=1))
-    assert eq(np.nanmax(x, axis=(0, 1)), da.nanmax(d, axis=(0, 1)))
-    assert eq(np.nanvar(x), da.nanvar(d))
-    assert eq(np.nanstd(x, axis=0), da.nanstd(d, axis=0))
-    assert eq(np.nanargmin(x, axis=0), da.nanargmin(d, axis=0))
-    assert eq(np.nanargmax(x, axis=0), da.nanargmax(d, axis=0))
-    assert eq(nanprod(x), da.nanprod(d))
+    assert_eq(np.nansum(x), da.nansum(d))
+    assert_eq(np.nansum(x, axis=0), da.nansum(d, axis=0))
+    assert_eq(np.nanmean(x, axis=1), da.nanmean(d, axis=1))
+    assert_eq(np.nanmin(x, axis=1), da.nanmin(d, axis=1))
+    assert_eq(np.nanmax(x, axis=(0, 1)), da.nanmax(d, axis=(0, 1)))
+    assert_eq(np.nanvar(x), da.nanvar(d))
+    assert_eq(np.nanstd(x, axis=0), da.nanstd(d, axis=0))
+    assert_eq(np.nanargmin(x, axis=0), da.nanargmin(d, axis=0))
+    assert_eq(np.nanargmax(x, axis=0), da.nanargmax(d, axis=0))
+    assert_eq(nanprod(x), da.nanprod(d))
 
 
 def test_0d_array():

pip install -e .[complete]
parse_log_pytest
numpy>=1.16.0 pandas>=1.0.0 cloudpickle partd distributed s3fs toolz psutil pytables bokeh bcolz scipy h5py ipython
pytest
apt-get update apt-get install -y graphviz liblzma-dev
3.5
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aiobotocore @ file:///opt/conda/conda-bld/aiobotocore_1643638228694/work
aiohttp @ file:///tmp/build/80754af9/aiohttp_1632748060317/work
aioitertools @ file:///tmp/build/80754af9/aioitertools_1607109665762/work
async-timeout==3.0.1
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
backcall @ file:///home/ktietz/src/ci/backcall_1611930011877/work
bcolz==1.2.1
bokeh @ file:///tmp/build/80754af9/bokeh_1620710048147/work
boto3==1.20.24
botocore @ file:///opt/conda/conda-bld/botocore_1642672735464/work
brotlipy==0.7.0
certifi==2021.5.30
cffi @ file:///tmp/build/80754af9/cffi_1625814693874/work
chardet @ file:///tmp/build/80754af9/chardet_1607706739153/work
click==8.0.3
cloudpickle @ file:///tmp/build/80754af9/cloudpickle_1632508026186/work
contextvars==2.4
cryptography @ file:///tmp/build/80754af9/cryptography_1635366128178/work
cytoolz==0.11.0
-e git+https://github.com/dask/dask.git@b4d3dba54fa488f60a808b9f7629aea4c156176e#egg=dask
decorator @ file:///opt/conda/conda-bld/decorator_1643638310831/work
distributed==1.12.1
fsspec @ file:///opt/conda/conda-bld/fsspec_1642510437511/work
h5py==2.10.0
HeapDict @ file:///Users/ktietz/demo/mc3/conda-bld/heapdict_1630598515714/work
idna @ file:///tmp/build/80754af9/idna_1637925883363/work
idna-ssl @ file:///tmp/build/80754af9/idna_ssl_1611752490495/work
immutables @ file:///tmp/build/80754af9/immutables_1628888996840/work
importlib-metadata==4.8.3
iniconfig==1.1.1
ipython @ file:///tmp/build/80754af9/ipython_1593447367857/work
ipython-genutils @ file:///tmp/build/80754af9/ipython_genutils_1606773439826/work
jedi @ file:///tmp/build/80754af9/jedi_1606932572482/work
Jinja2 @ file:///opt/conda/conda-bld/jinja2_1647436528585/work
jmespath @ file:///Users/ktietz/demo/mc3/conda-bld/jmespath_1630583964805/work
locket==0.2.1
MarkupSafe @ file:///tmp/build/80754af9/markupsafe_1621528150516/work
mock @ file:///tmp/build/80754af9/mock_1607622725907/work
msgpack @ file:///tmp/build/80754af9/msgpack-python_1612287171716/work
msgpack-python==0.5.6
multidict @ file:///tmp/build/80754af9/multidict_1607367768400/work
numexpr @ file:///tmp/build/80754af9/numexpr_1618853194344/work
numpy @ file:///tmp/build/80754af9/numpy_and_numpy_base_1603483703303/work
olefile @ file:///Users/ktietz/demo/mc3/conda-bld/olefile_1629805411829/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pandas==1.1.5
parso==0.7.0
partd @ file:///opt/conda/conda-bld/partd_1647245470509/work
pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
pickleshare @ file:///tmp/build/80754af9/pickleshare_1606932040724/work
Pillow @ file:///tmp/build/80754af9/pillow_1625670622947/work
pluggy==1.0.0
prompt-toolkit @ file:///tmp/build/80754af9/prompt-toolkit_1633440160888/work
psutil @ file:///tmp/build/80754af9/psutil_1612297621795/work
ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
py==1.11.0
pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work
Pygments @ file:///opt/conda/conda-bld/pygments_1644249106324/work
pyOpenSSL @ file:///opt/conda/conda-bld/pyopenssl_1643788558760/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
PySocks @ file:///tmp/build/80754af9/pysocks_1605305763431/work
pytest==7.0.1
python-dateutil @ file:///tmp/build/80754af9/python-dateutil_1626374649649/work
pytz==2021.3
PyYAML==5.4.1
s3fs @ file:///opt/conda/conda-bld/s3fs_1643701468749/work
s3transfer==0.5.2
scipy @ file:///tmp/build/80754af9/scipy_1597686635649/work
six @ file:///tmp/build/80754af9/six_1644875935023/work
sortedcontainers @ file:///tmp/build/80754af9/sortedcontainers_1623949099177/work
tables==3.6.1
tblib @ file:///Users/ktietz/demo/mc3/conda-bld/tblib_1629402031467/work
tomli==1.2.3
toolz @ file:///tmp/build/80754af9/toolz_1636545406491/work
tornado @ file:///tmp/build/80754af9/tornado_1606942266872/work
traitlets @ file:///tmp/build/80754af9/traitlets_1632746497744/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3 @ file:///opt/conda/conda-bld/urllib3_1643638302206/work
wcwidth @ file:///Users/ktietz/demo/mc3/conda-bld/wcwidth_1629357192024/work
wrapt==1.12.1
yarl @ file:///tmp/build/80754af9/yarl_1606939915466/work
zict==2.0.0
zipp==3.6.0

name: dask
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - aiobotocore=2.1.0=pyhd3eb1b0_0
  - aiohttp=3.7.4.post0=py36h7f8727e_2
  - aioitertools=0.7.1=pyhd3eb1b0_0
  - async-timeout=3.0.1=py36h06a4308_0
  - attrs=21.4.0=pyhd3eb1b0_0
  - backcall=0.2.0=pyhd3eb1b0_0
  - bcolz=1.2.1=py36h04863e7_0
  - blas=1.0=openblas
  - blosc=1.21.3=h6a678d5_0
  - bokeh=2.3.2=py36h06a4308_0
  - botocore=1.23.24=pyhd3eb1b0_0
  - brotlipy=0.7.0=py36h27cfd23_1003
  - bzip2=1.0.8=h5eee18b_6
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - cffi=1.14.6=py36h400218f_0
  - chardet=4.0.0=py36h06a4308_1003
  - click=8.0.3=pyhd3eb1b0_0
  - cloudpickle=2.0.0=pyhd3eb1b0_0
  - contextvars=2.4=py_0
  - cryptography=35.0.0=py36hd23ed53_0
  - cytoolz=0.11.0=py36h7b6447c_0
  - decorator=5.1.1=pyhd3eb1b0_0
  - freetype=2.12.1=h4a9f257_0
  - fsspec=2022.1.0=pyhd3eb1b0_0
  - giflib=5.2.2=h5eee18b_0
  - h5py=2.10.0=py36h7918eee_0
  - hdf5=1.10.4=hb1b8bf9_0
  - heapdict=1.0.1=pyhd3eb1b0_0
  - idna=3.3=pyhd3eb1b0_0
  - idna_ssl=1.1.0=py36h06a4308_0
  - immutables=0.16=py36h7f8727e_0
  - ipython=7.16.1=py36h5ca1d4c_0
  - ipython_genutils=0.2.0=pyhd3eb1b0_1
  - jedi=0.17.2=py36h06a4308_1
  - jinja2=3.0.3=pyhd3eb1b0_0
  - jmespath=0.10.0=pyhd3eb1b0_0
  - jpeg=9e=h5eee18b_3
  - lcms2=2.16=hb9589c4_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - lerc=4.0.0=h6a678d5_0
  - libdeflate=1.22=h5eee18b_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgfortran-ng=7.5.0=ha8ba4b0_17
  - libgfortran4=7.5.0=ha8ba4b0_17
  - libgomp=11.2.0=h1234567_1
  - libopenblas=0.3.18=hf726d26_0
  - libpng=1.6.39=h5eee18b_0
  - libstdcxx-ng=11.2.0=h1234567_1
  - libtiff=4.5.1=hffd6297_1
  - libwebp=1.2.4=h11a3e52_1
  - libwebp-base=1.2.4=h5eee18b_1
  - locket=0.2.1=py36h06a4308_1
  - lz4-c=1.9.4=h6a678d5_1
  - lzo=2.10=h7b6447c_2
  - markupsafe=2.0.1=py36h27cfd23_0
  - mock=4.0.3=pyhd3eb1b0_0
  - multidict=5.1.0=py36h27cfd23_2
  - ncurses=6.4=h6a678d5_0
  - numexpr=2.7.3=py36h4be448d_1
  - numpy=1.19.2=py36h6163131_0
  - numpy-base=1.19.2=py36h75fe3a5_0
  - olefile=0.46=pyhd3eb1b0_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pandas=1.1.5=py36ha9443f7_0
  - parso=0.7.0=py_0
  - partd=1.2.0=pyhd3eb1b0_1
  - pexpect=4.8.0=pyhd3eb1b0_3
  - pickleshare=0.7.5=pyhd3eb1b0_1003
  - pillow=8.3.1=py36h5aabda8_0
  - pip=21.2.2=py36h06a4308_0
  - prompt-toolkit=3.0.20=pyhd3eb1b0_0
  - psutil=5.8.0=py36h27cfd23_1
  - ptyprocess=0.7.0=pyhd3eb1b0_2
  - pycparser=2.21=pyhd3eb1b0_0
  - pygments=2.11.2=pyhd3eb1b0_0
  - pyopenssl=22.0.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pysocks=1.7.1=py36h06a4308_0
  - pytables=3.6.1=py36h71ec239_0
  - python=3.6.13=h12debd9_1
  - python-dateutil=2.8.2=pyhd3eb1b0_0
  - pytz=2021.3=pyhd3eb1b0_0
  - pyyaml=5.4.1=py36h27cfd23_1
  - readline=8.2=h5eee18b_0
  - s3fs=2022.1.0=pyhd3eb1b0_0
  - scipy=1.5.2=py36habc2bb6_0
  - setuptools=58.0.4=py36h06a4308_0
  - six=1.16.0=pyhd3eb1b0_1
  - sortedcontainers=2.4.0=pyhd3eb1b0_0
  - sqlite=3.45.3=h5eee18b_0
  - tblib=1.7.0=pyhd3eb1b0_0
  - tk=8.6.14=h39e8969_0
  - toolz=0.11.2=pyhd3eb1b0_0
  - tornado=6.1=py36h27cfd23_0
  - traitlets=4.3.3=py36h06a4308_0
  - typing-extensions=4.1.1=hd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - urllib3=1.26.8=pyhd3eb1b0_0
  - wcwidth=0.2.5=pyhd3eb1b0_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - wrapt=1.12.1=py36h7b6447c_1
  - xz=5.6.4=h5eee18b_1
  - yaml=0.2.5=h7b6447c_0
  - yarl=1.6.3=py36h27cfd23_0
  - zict=2.0.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - zstd=1.5.6=hc292b87_0
  - pip:
      - boto3==1.20.24
      - distributed==1.12.1
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - msgpack-python==0.5.6
      - pluggy==1.0.0
      - py==1.11.0
      - pytest==7.0.1
      - s3transfer==0.5.2
      - tomli==1.2.3
      - zipp==3.6.0
prefix: /opt/conda/envs/dask

dask/array/tests/test_array_core.py::test_repr dask/array/tests/test_reductions.py::test_reductions_2D[f4] dask/array/tests/test_reductions.py::test_reductions_2D[i4]
dask/array/tests/test_array_core.py::test_field_access dask/array/tests/test_array_core.py::test_coarsen dask/array/tests/test_array_core.py::test_coarsen_with_excess
dask/array/tests/test_array_core.py::test_getem dask/array/tests/test_array_core.py::test_top dask/array/tests/test_array_core.py::test_top_supports_broadcasting_rules dask/array/tests/test_array_core.py::test_concatenate3_on_scalars dask/array/tests/test_array_core.py::test_chunked_dot_product dask/array/tests/test_array_core.py::test_chunked_transpose_plus_one dask/array/tests/test_array_core.py::test_transpose dask/array/tests/test_array_core.py::test_broadcast_dimensions_works_with_singleton_dimensions dask/array/tests/test_array_core.py::test_broadcast_dimensions dask/array/tests/test_array_core.py::test_Array dask/array/tests/test_array_core.py::test_uneven_chunks dask/array/tests/test_array_core.py::test_numblocks_suppoorts_singleton_block_dims dask/array/tests/test_array_core.py::test_keys dask/array/tests/test_array_core.py::test_Array_computation dask/array/tests/test_array_core.py::test_stack dask/array/tests/test_array_core.py::test_short_stack dask/array/tests/test_array_core.py::test_stack_scalars dask/array/tests/test_array_core.py::test_concatenate dask/array/tests/test_array_core.py::test_concatenate_fixlen_strings dask/array/tests/test_array_core.py::test_vstack dask/array/tests/test_array_core.py::test_hstack dask/array/tests/test_array_core.py::test_dstack dask/array/tests/test_array_core.py::test_take dask/array/tests/test_array_core.py::test_compress dask/array/tests/test_array_core.py::test_binops dask/array/tests/test_array_core.py::test_isnull dask/array/tests/test_array_core.py::test_isclose dask/array/tests/test_array_core.py::test_broadcast_shapes dask/array/tests/test_array_core.py::test_elemwise_on_scalars dask/array/tests/test_array_core.py::test_partial_by_order dask/array/tests/test_array_core.py::test_elemwise_with_ndarrays dask/array/tests/test_array_core.py::test_elemwise_differently_chunked dask/array/tests/test_array_core.py::test_operators dask/array/tests/test_array_core.py::test_operator_dtype_promotion dask/array/tests/test_array_core.py::test_tensordot dask/array/tests/test_array_core.py::test_dot_method dask/array/tests/test_array_core.py::test_T dask/array/tests/test_array_core.py::test_norm dask/array/tests/test_array_core.py::test_choose dask/array/tests/test_array_core.py::test_where dask/array/tests/test_array_core.py::test_where_has_informative_error dask/array/tests/test_array_core.py::test_insert dask/array/tests/test_array_core.py::test_multi_insert dask/array/tests/test_array_core.py::test_broadcast_to dask/array/tests/test_array_core.py::test_ravel dask/array/tests/test_array_core.py::test_unravel dask/array/tests/test_array_core.py::test_reshape dask/array/tests/test_array_core.py::test_reshape_unknown_dimensions dask/array/tests/test_array_core.py::test_full dask/array/tests/test_array_core.py::test_map_blocks dask/array/tests/test_array_core.py::test_map_blocks2 dask/array/tests/test_array_core.py::test_map_blocks_with_constants dask/array/tests/test_array_core.py::test_map_blocks_with_kwargs dask/array/tests/test_array_core.py::test_fromfunction dask/array/tests/test_array_core.py::test_from_function_requires_block_args dask/array/tests/test_array_core.py::test_slicing_with_ellipsis dask/array/tests/test_array_core.py::test_slicing_with_ndarray dask/array/tests/test_array_core.py::test_dtype dask/array/tests/test_array_core.py::test_blockdims_from_blockshape dask/array/tests/test_array_core.py::test_coerce dask/array/tests/test_array_core.py::test_store dask/array/tests/test_array_core.py::test_store_compute_false dask/array/tests/test_array_core.py::test_store_locks dask/array/tests/test_array_core.py::test_to_hdf5 dask/array/tests/test_array_core.py::test_np_array_with_zero_dimensions dask/array/tests/test_array_core.py::test_unique dask/array/tests/test_array_core.py::test_dtype_complex dask/array/tests/test_array_core.py::test_astype dask/array/tests/test_array_core.py::test_arithmetic dask/array/tests/test_array_core.py::test_elemwise_consistent_names dask/array/tests/test_array_core.py::test_optimize dask/array/tests/test_array_core.py::test_slicing_with_non_ndarrays dask/array/tests/test_array_core.py::test_getarray dask/array/tests/test_array_core.py::test_squeeze dask/array/tests/test_array_core.py::test_size dask/array/tests/test_array_core.py::test_nbytes dask/array/tests/test_array_core.py::test_Array_normalizes_dtype dask/array/tests/test_array_core.py::test_args dask/array/tests/test_array_core.py::test_from_array_with_lock dask/array/tests/test_array_core.py::test_from_array_slicing_results_in_ndarray dask/array/tests/test_array_core.py::test_from_func dask/array/tests/test_array_core.py::test_topk dask/array/tests/test_array_core.py::test_topk_k_bigger_than_chunk dask/array/tests/test_array_core.py::test_bincount dask/array/tests/test_array_core.py::test_bincount_with_weights dask/array/tests/test_array_core.py::test_bincount_raises_informative_error_on_missing_minlength_kwarg dask/array/tests/test_array_core.py::test_histogram dask/array/tests/test_array_core.py::test_histogram_alternative_bins_range dask/array/tests/test_array_core.py::test_histogram_return_type dask/array/tests/test_array_core.py::test_histogram_extra_args_and_shapes dask/array/tests/test_array_core.py::test_concatenate3_2 dask/array/tests/test_array_core.py::test_map_blocks3 dask/array/tests/test_array_core.py::test_from_array_with_missing_chunks dask/array/tests/test_array_core.py::test_cache dask/array/tests/test_array_core.py::test_take_dask_from_numpy dask/array/tests/test_array_core.py::test_normalize_chunks dask/array/tests/test_array_core.py::test_raise_on_no_chunks dask/array/tests/test_array_core.py::test_chunks_is_immutable dask/array/tests/test_array_core.py::test_raise_on_bad_kwargs dask/array/tests/test_array_core.py::test_long_slice dask/array/tests/test_array_core.py::test_h5py_newaxis dask/array/tests/test_array_core.py::test_ellipsis_slicing dask/array/tests/test_array_core.py::test_point_slicing dask/array/tests/test_array_core.py::test_point_slicing_with_full_slice dask/array/tests/test_array_core.py::test_slice_with_floats dask/array/tests/test_array_core.py::test_vindex_errors dask/array/tests/test_array_core.py::test_vindex_merge dask/array/tests/test_array_core.py::test_empty_array dask/array/tests/test_array_core.py::test_array dask/array/tests/test_array_core.py::test_cov dask/array/tests/test_array_core.py::test_corrcoef dask/array/tests/test_array_core.py::test_memmap dask/array/tests/test_array_core.py::test_to_npy_stack dask/array/tests/test_array_core.py::test_view dask/array/tests/test_array_core.py::test_view_fortran dask/array/tests/test_array_core.py::test_h5py_tokenize dask/array/tests/test_array_core.py::test_map_blocks_with_changed_dimension dask/array/tests/test_array_core.py::test_broadcast_chunks dask/array/tests/test_array_core.py::test_chunks_error dask/array/tests/test_array_core.py::test_array_compute_forward_kwargs dask/array/tests/test_array_core.py::test_dont_fuse_outputs dask/array/tests/test_array_core.py::test_dont_dealias_outputs dask/array/tests/test_array_core.py::test_timedelta_op dask/array/tests/test_array_core.py::test_to_delayed dask/array/tests/test_array_core.py::test_cumulative dask/array/tests/test_array_core.py::test_eye dask/array/tests/test_array_core.py::test_diag dask/array/tests/test_array_core.py::test_tril_triu dask/array/tests/test_array_core.py::test_tril_triu_errors dask/array/tests/test_array_core.py::test_atop_names dask/array/tests/test_array_core.py::test_atop_kwargs dask/array/tests/test_array_core.py::test_from_delayed dask/array/tests/test_array_core.py::test_A_property dask/array/tests/test_array_core.py::test_copy dask/array/tests/test_array_core.py::test_npartitions dask/array/tests/test_array_core.py::test_astype_gh1151 dask/array/tests/test_array_core.py::test_elemwise_name dask/array/tests/test_array_core.py::test_map_blocks_name dask/array/tests/test_array_core.py::test_from_array_names dask/array/tests/test_reductions.py::test_reductions_1D[f4] dask/array/tests/test_reductions.py::test_reductions_1D[i4] dask/array/tests/test_reductions.py::test_arg_reductions[argmin-argmin] dask/array/tests/test_reductions.py::test_arg_reductions[argmax-argmax] dask/array/tests/test_reductions.py::test_arg_reductions[_nanargmin-nanargmin] dask/array/tests/test_reductions.py::test_arg_reductions[_nanargmax-nanargmax] dask/array/tests/test_reductions.py::test_nanarg_reductions[_nanargmin-nanargmin] dask/array/tests/test_reductions.py::test_nanarg_reductions[_nanargmax-nanargmax] dask/array/tests/test_reductions.py::test_reductions_2D_nans dask/array/tests/test_reductions.py::test_moment dask/array/tests/test_reductions.py::test_reductions_with_negative_axes dask/array/tests/test_reductions.py::test_nan dask/array/tests/test_reductions.py::test_0d_array dask/array/tests/test_reductions.py::test_reduction_on_scalar dask/array/tests/test_reductions.py::test_tree_reduce_depth dask/array/tests/test_reductions.py::test_tree_reduce_set_options dask/array/tests/test_reductions.py::test_reduction_names
dask/array/core.py dask/array/utils.py dask/array/linalg.py dask/array/reductions.py
dask/array/core.py dask/array/utils.py dask/array/linalg.py dask/array/reductions.py