diff --git a/dask/array/__init__.py b/dask/array/__init__.py
--- a/dask/array/__init__.py
+++ b/dask/array/__init__.py
@@ -158,6 +158,7 @@
     )
     from dask.array.tiledb_io import from_tiledb, to_tiledb
     from dask.array.ufunc import (
+        abs,
         absolute,
         add,
         angle,
@@ -211,6 +212,7 @@
         isposinf,
         isreal,
         ldexp,
+        left_shift,
         less,
         less_equal,
         log,
@@ -232,12 +234,14 @@
         negative,
         nextafter,
         not_equal,
+        positive,
         power,
         rad2deg,
         radians,
         real,
         reciprocal,
         remainder,
+        right_shift,
         rint,
         sign,
         signbit,
diff --git a/dask/array/ufunc.py b/dask/array/ufunc.py
--- a/dask/array/ufunc.py
+++ b/dask/array/ufunc.py
@@ -177,6 +177,7 @@ def outer(self, A, B, **kwargs):
 true_divide = ufunc(np.true_divide)
 floor_divide = ufunc(np.floor_divide)
 negative = ufunc(np.negative)
+positive = ufunc(np.positive)
 power = ufunc(np.power)
 float_power = ufunc(np.float_power)
 remainder = ufunc(np.remainder)
@@ -237,6 +238,8 @@ def outer(self, A, B, **kwargs):
 bitwise_xor = ufunc(np.bitwise_xor)
 bitwise_not = ufunc(np.bitwise_not)
 invert = bitwise_not
+left_shift = ufunc(np.left_shift)
+right_shift = ufunc(np.right_shift)
 
 # floating functions
 isfinite = ufunc(np.isfinite)
@@ -262,6 +265,7 @@ def outer(self, A, B, **kwargs):
 fabs = ufunc(np.fabs)
 sign = ufunc(np.sign)
 absolute = ufunc(np.absolute)
+abs = absolute
 
 # non-ufunc elementwise functions
 clip = wrap_elemwise(np.clip)

diff --git a/dask/array/tests/test_ufunc.py b/dask/array/tests/test_ufunc.py
--- a/dask/array/tests/test_ufunc.py
+++ b/dask/array/tests/test_ufunc.py
@@ -62,6 +62,7 @@ def test_ufunc():
     "greater_equal",
     "hypot",
     "ldexp",
+    "left_shift",
     "less",
     "less_equal",
     "logaddexp",
@@ -77,12 +78,14 @@ def test_ufunc():
     "not_equal",
     "power",
     "remainder",
+    "right_shift",
     "subtract",
     "true_divide",
     "float_power",
 ]
 
 unary_ufuncs = [
+    "abs",
     "absolute",
     "arccos",
     "arccosh",
@@ -114,6 +117,7 @@ def test_ufunc():
     "log2",
     "logical_not",
     "negative",
+    "positive",
     "rad2deg",
     "radians",
     "reciprocal",

Add missing NumPy ufuncs: `abs`, `left_shift`, `right_shift`, `positive`
Add these to `dask.array` for consistency with both `numpy` and the Array API (https://github.com/dask/community/issues/109).


dask/array/tests/test_ufunc.py::test_unary_ufunc[abs] dask/array/tests/test_ufunc.py::test_unary_ufunc[positive] dask/array/tests/test_ufunc.py::test_binary_ufunc[right_shift] dask/array/tests/test_ufunc.py::test_binary_ufunc[left_shift]
dask/array/tests/test_ufunc.py::test_ufunc_where[True-True-True-None] dask/array/tests/test_ufunc.py::test_complex[iscomplex] dask/array/tests/test_ufunc.py::test_unary_ufunc[fabs] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[True-True-False] dask/array/tests/test_ufunc.py::test_ufunc_meta[log] dask/array/tests/test_ufunc.py::test_unary_ufunc[log1p] dask/array/tests/test_ufunc.py::test_array_ufunc dask/array/tests/test_ufunc.py::test_unary_ufunc[arccosh] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-True-True-None] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-True-True-f8] dask/array/tests/test_ufunc.py::test_out_shape_mismatch dask/array/tests/test_ufunc.py::test_binary_ufunc[bitwise_or] dask/array/tests/test_ufunc.py::test_unary_ufunc[log2] dask/array/tests/test_ufunc.py::test_binary_ufunc[fmin] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-False-True-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[minimum] dask/array/tests/test_ufunc.py::test_divmod dask/array/tests/test_ufunc.py::test_ufunc_meta[modf] dask/array/tests/test_ufunc.py::test_unary_ufunc[floor] dask/array/tests/test_ufunc.py::test_clip dask/array/tests/test_ufunc.py::test_ufunc_where[False-True-False-f8] dask/array/tests/test_ufunc.py::test_unary_ufunc[isfinite] dask/array/tests/test_ufunc.py::test_unary_ufunc[spacing] dask/array/tests/test_ufunc.py::test_unary_ufunc[square] dask/array/tests/test_ufunc.py::test_binary_ufunc[greater_equal] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-True-True-f8] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[False-False-True] dask/array/tests/test_ufunc.py::test_ufunc_where[False-True-True-f8] dask/array/tests/test_ufunc.py::test_unary_ufunc[exp2] dask/array/tests/test_ufunc.py::test_out_numpy dask/array/tests/test_ufunc.py::test_unary_ufunc[arcsin] dask/array/tests/test_ufunc.py::test_binary_ufunc[fmax] dask/array/tests/test_ufunc.py::test_complex[imag] dask/array/tests/test_ufunc.py::test_binary_ufunc[floor_divide] dask/array/tests/test_ufunc.py::test_unary_ufunc[isinf] dask/array/tests/test_ufunc.py::test_binary_ufunc[float_power] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-False-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[fmod] dask/array/tests/test_ufunc.py::test_unary_ufunc[radians] dask/array/tests/test_ufunc.py::test_ufunc_where[True-True-True-f8] dask/array/tests/test_ufunc.py::test_unary_ufunc[ceil] dask/array/tests/test_ufunc.py::test_ufunc_where[True-True-False-None] dask/array/tests/test_ufunc.py::test_frompyfunc dask/array/tests/test_ufunc.py::test_unary_ufunc[tanh] dask/array/tests/test_ufunc.py::test_binary_ufunc[remainder] dask/array/tests/test_ufunc.py::test_ufunc_where[True-False-True-None] dask/array/tests/test_ufunc.py::test_unary_ufunc[arccos] dask/array/tests/test_ufunc.py::test_ufunc_where[False-False-True-None] dask/array/tests/test_ufunc.py::test_unary_ufunc[exp] dask/array/tests/test_ufunc.py::test_ufunc_where_doesnt_mutate_out dask/array/tests/test_ufunc.py::test_binary_ufunc[bitwise_and] dask/array/tests/test_ufunc.py::test_unary_ufunc[sqrt] dask/array/tests/test_ufunc.py::test_ufunc_where[False-True-False-None] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-True-False-None] dask/array/tests/test_ufunc.py::test_unary_ufunc[rint] dask/array/tests/test_ufunc.py::test_unary_ufunc[absolute] dask/array/tests/test_ufunc.py::test_unary_ufunc[trunc] dask/array/tests/test_ufunc.py::test_unary_ufunc[expm1] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[True-True-True] dask/array/tests/test_ufunc.py::test_ufunc_2results[frexp] dask/array/tests/test_ufunc.py::test_binary_ufunc[bitwise_xor] dask/array/tests/test_ufunc.py::test_unary_ufunc[logical_not] dask/array/tests/test_ufunc.py::test_ufunc_where[True-False-False-None] dask/array/tests/test_ufunc.py::test_unary_ufunc[arctanh] dask/array/tests/test_ufunc.py::test_unary_ufunc[cos] dask/array/tests/test_ufunc.py::test_binary_ufunc[nextafter] dask/array/tests/test_ufunc.py::test_dtype_kwarg[float32] dask/array/tests/test_ufunc.py::test_binary_ufunc[less_equal] dask/array/tests/test_ufunc.py::test_binary_ufunc[true_divide] dask/array/tests/test_ufunc.py::test_unary_ufunc[sign] dask/array/tests/test_ufunc.py::test_unary_ufunc[sin] dask/array/tests/test_ufunc.py::test_binary_ufunc[logical_xor] dask/array/tests/test_ufunc.py::test_binary_ufunc[logical_or] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[True-False-True] dask/array/tests/test_ufunc.py::test_issignedinf dask/array/tests/test_ufunc.py::test_ufunc_where[False-False-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[divide] dask/array/tests/test_ufunc.py::test_array_ufunc_binop dask/array/tests/test_ufunc.py::test_ufunc_where[dask-True-True-None] dask/array/tests/test_ufunc.py::test_unary_ufunc[tan] dask/array/tests/test_ufunc.py::test_ufunc_where_no_out dask/array/tests/test_ufunc.py::test_dtype_kwarg[int64] dask/array/tests/test_ufunc.py::test_unary_ufunc[bitwise_not] dask/array/tests/test_ufunc.py::test_unary_ufunc[arctan] dask/array/tests/test_ufunc.py::test_unary_ufunc[isnan] dask/array/tests/test_ufunc.py::test_binary_ufunc[less] dask/array/tests/test_ufunc.py::test_ufunc_where[False-True-True-None] dask/array/tests/test_ufunc.py::test_angle dask/array/tests/test_ufunc.py::test_non_ufunc_others[nan_to_num] dask/array/tests/test_ufunc.py::test_complex[real] dask/array/tests/test_ufunc.py::test_unary_ufunc[log10] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-False-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[mod] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[False-True-True] dask/array/tests/test_ufunc.py::test_non_ufunc_others[sinc] dask/array/tests/test_ufunc.py::test_ufunc_where[True-False-True-f8] dask/array/tests/test_ufunc.py::test_dtype_kwarg[int32] dask/array/tests/test_ufunc.py::test_unary_ufunc[cosh] dask/array/tests/test_ufunc.py::test_binary_ufunc[copysign] dask/array/tests/test_ufunc.py::test_binary_ufunc[logical_and] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-False-True-f8] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[True-False-False] dask/array/tests/test_ufunc.py::test_binary_ufunc[maximum] dask/array/tests/test_ufunc.py::test_unary_ufunc[deg2rad] dask/array/tests/test_ufunc.py::test_unary_ufunc[reciprocal] dask/array/tests/test_ufunc.py::test_unary_ufunc[signbit] dask/array/tests/test_ufunc.py::test_ufunc_meta[frexp] dask/array/tests/test_ufunc.py::test_binary_ufunc[add] dask/array/tests/test_ufunc.py::test_ufunc dask/array/tests/test_ufunc.py::test_binary_ufunc[greater] dask/array/tests/test_ufunc.py::test_unary_ufunc[negative] dask/array/tests/test_ufunc.py::test_ufunc_2results[modf] dask/array/tests/test_ufunc.py::test_binary_ufunc[not_equal] dask/array/tests/test_ufunc.py::test_binary_ufunc[multiply] dask/array/tests/test_ufunc.py::test_unary_ufunc[degrees] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-False-True-None] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-True-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[logaddexp2] dask/array/tests/test_ufunc.py::test_unary_ufunc[sinh] dask/array/tests/test_ufunc.py::test_frompyfunc_wrapper dask/array/tests/test_ufunc.py::test_ufunc_outer dask/array/tests/test_ufunc.py::test_binary_ufunc[hypot] dask/array/tests/test_ufunc.py::test_non_ufunc_others[i0] dask/array/tests/test_ufunc.py::test_ufunc_where[dask-False-False-None] dask/array/tests/test_ufunc.py::test_array_ufunc_out dask/array/tests/test_ufunc.py::test_dtype_kwarg[float64] dask/array/tests/test_ufunc.py::test_unary_ufunc[arcsinh] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[False-True-False] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-True-False-None] dask/array/tests/test_ufunc.py::test_complex[isreal] dask/array/tests/test_ufunc.py::test_ufunc_where[False-False-False-None] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-True-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[arctan2] dask/array/tests/test_ufunc.py::test_unsupported_ufunc_methods dask/array/tests/test_ufunc.py::test_unary_ufunc[conj] dask/array/tests/test_ufunc.py::test_ufunc_where[True-False-False-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[equal] dask/array/tests/test_ufunc.py::test_binary_ufunc[logaddexp] dask/array/tests/test_ufunc.py::test_binary_ufunc[power] dask/array/tests/test_ufunc.py::test_binary_ufunc[subtract] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-False-False-None] dask/array/tests/test_ufunc.py::test_ufunc_where[True-True-False-f8] dask/array/tests/test_ufunc.py::test_unary_ufunc[cbrt] dask/array/tests/test_ufunc.py::test_unary_ufunc[invert] dask/array/tests/test_ufunc.py::test_ufunc_where_broadcasts[False-False-False] dask/array/tests/test_ufunc.py::test_unary_ufunc[rad2deg] dask/array/tests/test_ufunc.py::test_ufunc_where[numpy-False-True-None] dask/array/tests/test_ufunc.py::test_ufunc_where[False-False-True-f8] dask/array/tests/test_ufunc.py::test_binary_ufunc[ldexp] dask/array/tests/test_ufunc.py::test_unary_ufunc[log]