array-api-extra 0.2.0__py3-none-any.whl → 0.2.1.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
- from ._funcs import atleast_nd, cov, create_diagonal, expand_dims, kron, sinc
3
+ from ._funcs import atleast_nd, cov, create_diagonal, expand_dims, kron, setdiff1d, sinc
4
4
 
5
- __version__ = "0.2.0"
5
+ __version__ = "0.2.1.dev0"
6
6
 
7
+ # pylint: disable=duplicate-code
7
8
  __all__ = [
8
9
  "__version__",
9
10
  "atleast_nd",
@@ -11,5 +12,6 @@ __all__ = [
11
12
  "create_diagonal",
12
13
  "expand_dims",
13
14
  "kron",
15
+ "setdiff1d",
14
16
  "sinc",
15
17
  ]
array_api_extra/_funcs.py CHANGED
@@ -1,12 +1,22 @@
1
- from __future__ import annotations
1
+ from __future__ import annotations # https://github.com/pylint-dev/pylint/pull/9990
2
2
 
3
+ import typing
3
4
  import warnings
4
- from typing import TYPE_CHECKING
5
5
 
6
- if TYPE_CHECKING:
7
- from ._typing import Array, ModuleType
6
+ if typing.TYPE_CHECKING:
7
+ from ._lib._typing import Array, ModuleType
8
8
 
9
- __all__ = ["atleast_nd", "cov", "create_diagonal", "expand_dims", "kron", "sinc"]
9
+ from ._lib import _utils
10
+
11
+ __all__ = [
12
+ "atleast_nd",
13
+ "cov",
14
+ "create_diagonal",
15
+ "expand_dims",
16
+ "kron",
17
+ "setdiff1d",
18
+ "sinc",
19
+ ]
10
20
 
11
21
 
12
22
  def atleast_nd(x: Array, /, *, ndim: int, xp: ModuleType) -> Array:
@@ -399,6 +409,53 @@ def kron(a: Array, b: Array, /, *, xp: ModuleType) -> Array:
399
409
  return xp.reshape(result, tuple(xp.multiply(a_shape, b_shape)))
400
410
 
401
411
 
412
+ def setdiff1d(
413
+ x1: Array, x2: Array, /, *, assume_unique: bool = False, xp: ModuleType
414
+ ) -> Array:
415
+ """
416
+ Find the set difference of two arrays.
417
+
418
+ Return the unique values in `x1` that are not in `x2`.
419
+
420
+ Parameters
421
+ ----------
422
+ x1 : array
423
+ Input array.
424
+ x2 : array
425
+ Input comparison array.
426
+ assume_unique : bool
427
+ If ``True``, the input arrays are both assumed to be unique, which
428
+ can speed up the calculation. Default is ``False``.
429
+ xp : array_namespace
430
+ The standard-compatible namespace for `x1` and `x2`.
431
+
432
+ Returns
433
+ -------
434
+ res : array
435
+ 1D array of values in `x1` that are not in `x2`. The result
436
+ is sorted when `assume_unique` is ``False``, but otherwise only sorted
437
+ if the input is sorted.
438
+
439
+ Examples
440
+ --------
441
+ >>> import array_api_strict as xp
442
+ >>> import array_api_extra as xpx
443
+
444
+ >>> x1 = xp.asarray([1, 2, 3, 2, 4, 1])
445
+ >>> x2 = xp.asarray([3, 4, 5, 6])
446
+ >>> xpx.setdiff1d(x1, x2, xp=xp)
447
+ Array([1, 2], dtype=array_api_strict.int64)
448
+
449
+ """
450
+
451
+ if assume_unique:
452
+ x1 = xp.reshape(x1, (-1,))
453
+ else:
454
+ x1 = xp.unique_values(x1)
455
+ x2 = xp.unique_values(x2)
456
+ return x1[_utils.in1d(x1, x2, assume_unique=True, invert=True, xp=xp)]
457
+
458
+
402
459
  def sinc(x: Array, /, *, xp: ModuleType) -> Array:
403
460
  r"""
404
461
  Return the normalized sinc function.
@@ -440,10 +497,10 @@ def sinc(x: Array, /, *, xp: ModuleType) -> Array:
440
497
 
441
498
  References
442
499
  ----------
443
- .. [1] Weisstein, Eric W. "Sinc Function." From MathWorld--A Wolfram Web
444
- Resource. https://mathworld.wolfram.com/SincFunction.html
445
- .. [2] Wikipedia, "Sinc function",
446
- https://en.wikipedia.org/wiki/Sinc_function
500
+ #. Weisstein, Eric W. "Sinc Function." From MathWorld--A Wolfram Web
501
+ Resource. https://mathworld.wolfram.com/SincFunction.html
502
+ #. Wikipedia, "Sinc function",
503
+ https://en.wikipedia.org/wiki/Sinc_function
447
504
 
448
505
  Examples
449
506
  --------
@@ -0,0 +1,168 @@
1
+ ### Helpers borrowed from array-api-compat
2
+
3
+ from __future__ import annotations # https://github.com/pylint-dev/pylint/pull/9990
4
+
5
+ import inspect
6
+ import sys
7
+ import typing
8
+
9
+ from typing_extensions import override
10
+
11
+ if typing.TYPE_CHECKING:
12
+ from ._typing import Array, Device
13
+
14
+ __all__ = ["device"]
15
+
16
+
17
+ # Placeholder object to represent the dask device
18
+ # when the array backend is not the CPU.
19
+ # (since it is not easy to tell which device a dask array is on)
20
+ class _dask_device: # pylint: disable=invalid-name
21
+ @override
22
+ def __repr__(self) -> str:
23
+ return "DASK_DEVICE"
24
+
25
+
26
+ _DASK_DEVICE = _dask_device()
27
+
28
+
29
+ # device() is not on numpy.ndarray or dask.array and to_device() is not on numpy.ndarray
30
+ # or cupy.ndarray. They are not included in array objects of this library
31
+ # because this library just reuses the respective ndarray classes without
32
+ # wrapping or subclassing them. These helper functions can be used instead of
33
+ # the wrapper functions for libraries that need to support both NumPy/CuPy and
34
+ # other libraries that use devices.
35
+ def device(x: Array, /) -> Device:
36
+ """
37
+ Hardware device the array data resides on.
38
+
39
+ This is equivalent to `x.device` according to the `standard
40
+ <https://data-apis.org/array-api/latest/API_specification/generated/array_api.array.device.html>`__.
41
+ This helper is included because some array libraries either do not have
42
+ the `device` attribute or include it with an incompatible API.
43
+
44
+ Parameters
45
+ ----------
46
+ x: array
47
+ array instance from an array API compatible library.
48
+
49
+ Returns
50
+ -------
51
+ out: device
52
+ a ``device`` object (see the `Device Support <https://data-apis.org/array-api/latest/design_topics/device_support.html>`__
53
+ section of the array API specification).
54
+
55
+ Notes
56
+ -----
57
+
58
+ For NumPy the device is always `"cpu"`. For Dask, the device is always a
59
+ special `DASK_DEVICE` object.
60
+
61
+ See Also
62
+ --------
63
+
64
+ to_device : Move array data to a different device.
65
+
66
+ """
67
+ if _is_numpy_array(x):
68
+ return "cpu"
69
+ if _is_dask_array(x):
70
+ # Peek at the metadata of the jax array to determine type
71
+ try:
72
+ import numpy as np # pylint: disable=import-outside-toplevel
73
+
74
+ if isinstance(x._meta, np.ndarray): # pylint: disable=protected-access
75
+ # Must be on CPU since backed by numpy
76
+ return "cpu"
77
+ except ImportError:
78
+ pass
79
+ return _DASK_DEVICE
80
+ if _is_jax_array(x):
81
+ # JAX has .device() as a method, but it is being deprecated so that it
82
+ # can become a property, in accordance with the standard. In order for
83
+ # this function to not break when JAX makes the flip, we check for
84
+ # both here.
85
+ if inspect.ismethod(x.device):
86
+ return x.device()
87
+ return x.device
88
+ if _is_pydata_sparse_array(x):
89
+ # `sparse` will gain `.device`, so check for this first.
90
+ x_device = getattr(x, "device", None)
91
+ if x_device is not None:
92
+ return x_device
93
+ # Everything but DOK has this attr.
94
+ try:
95
+ inner = x.data
96
+ except AttributeError:
97
+ return "cpu"
98
+ # Return the device of the constituent array
99
+ return device(inner)
100
+ return x.device
101
+
102
+
103
+ def _is_numpy_array(x: Array) -> bool:
104
+ """Return True if `x` is a NumPy array."""
105
+ # Avoid importing NumPy if it isn't already
106
+ if "numpy" not in sys.modules:
107
+ return False
108
+
109
+ import numpy as np # pylint: disable=import-outside-toplevel
110
+
111
+ # TODO: Should we reject ndarray subclasses?
112
+ return isinstance(x, (np.ndarray, np.generic)) and not _is_jax_zero_gradient_array(
113
+ x
114
+ )
115
+
116
+
117
+ def _is_dask_array(x: Array) -> bool:
118
+ """Return True if `x` is a dask.array Array."""
119
+ # Avoid importing dask if it isn't already
120
+ if "dask.array" not in sys.modules:
121
+ return False
122
+
123
+ # pylint: disable=import-error, import-outside-toplevel
124
+ import dask.array # type: ignore[import-not-found] # pyright: ignore[reportMissingImports]
125
+
126
+ return isinstance(x, dask.array.Array)
127
+
128
+
129
+ def _is_jax_zero_gradient_array(x: Array) -> bool:
130
+ """Return True if `x` is a zero-gradient array.
131
+
132
+ These arrays are a design quirk of Jax that may one day be removed.
133
+ See https://github.com/google/jax/issues/20620.
134
+ """
135
+ if "numpy" not in sys.modules or "jax" not in sys.modules:
136
+ return False
137
+
138
+ # pylint: disable=import-error, import-outside-toplevel
139
+ import jax # type: ignore[import-not-found] # pyright: ignore[reportMissingImports]
140
+ import numpy as np # pylint: disable=import-outside-toplevel
141
+
142
+ return isinstance(x, np.ndarray) and x.dtype == jax.float0 # pyright: ignore[reportUnknownVariableType]
143
+
144
+
145
+ def _is_jax_array(x: Array) -> bool:
146
+ """Return True if `x` is a JAX array."""
147
+ # Avoid importing jax if it isn't already
148
+ if "jax" not in sys.modules:
149
+ return False
150
+
151
+ # pylint: disable=import-error, import-outside-toplevel
152
+ import jax # pyright: ignore[reportMissingImports]
153
+
154
+ return isinstance(x, jax.Array) or _is_jax_zero_gradient_array(x)
155
+
156
+
157
+ def _is_pydata_sparse_array(x: Array) -> bool:
158
+ """Return True if `x` is an array from the `sparse` package."""
159
+
160
+ # Avoid importing jax if it isn't already
161
+ if "sparse" not in sys.modules:
162
+ return False
163
+
164
+ # pylint: disable=import-error, import-outside-toplevel
165
+ import sparse # type: ignore[import-not-found] # pyright: ignore[reportMissingImports]
166
+
167
+ # TODO: Account for other backends.
168
+ return isinstance(x, sparse.SparseArray)
@@ -0,0 +1,10 @@
1
+ from __future__ import annotations # https://github.com/pylint-dev/pylint/pull/9990
2
+
3
+ from types import ModuleType
4
+ from typing import Any
5
+
6
+ # To be changed to a Protocol later (see data-apis/array-api#589)
7
+ Array = Any # type: ignore[no-any-explicit]
8
+ Device = Any # type: ignore[no-any-explicit]
9
+
10
+ __all__ = ["Array", "Device", "ModuleType"]
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations # https://github.com/pylint-dev/pylint/pull/9990
2
+
3
+ import typing
4
+
5
+ if typing.TYPE_CHECKING:
6
+ from ._typing import Array, ModuleType
7
+
8
+ from . import _compat
9
+
10
+ __all__ = ["in1d"]
11
+
12
+
13
+ def in1d(
14
+ x1: Array,
15
+ x2: Array,
16
+ /,
17
+ *,
18
+ assume_unique: bool = False,
19
+ invert: bool = False,
20
+ xp: ModuleType,
21
+ ) -> Array:
22
+ """Checks whether each element of an array is also present in a
23
+ second array.
24
+
25
+ Returns a boolean array the same length as `x1` that is True
26
+ where an element of `x1` is in `x2` and False otherwise.
27
+
28
+ This function has been adapted using the original implementation
29
+ present in numpy:
30
+ https://github.com/numpy/numpy/blob/v1.26.0/numpy/lib/arraysetops.py#L524-L758
31
+ """
32
+
33
+ # This code is run to make the code significantly faster
34
+ if x2.shape[0] < 10 * x1.shape[0] ** 0.145:
35
+ if invert:
36
+ mask = xp.ones(x1.shape[0], dtype=xp.bool, device=x1.device)
37
+ for a in x2:
38
+ mask &= x1 != a
39
+ else:
40
+ mask = xp.zeros(x1.shape[0], dtype=xp.bool, device=x1.device)
41
+ for a in x2:
42
+ mask |= x1 == a
43
+ return mask
44
+
45
+ rev_idx = xp.empty(0) # placeholder
46
+ if not assume_unique:
47
+ x1, rev_idx = xp.unique_inverse(x1)
48
+ x2 = xp.unique_values(x2)
49
+
50
+ ar = xp.concat((x1, x2))
51
+ device_ = _compat.device(ar)
52
+ # We need this to be a stable sort.
53
+ order = xp.argsort(ar, stable=True)
54
+ reverse_order = xp.argsort(order, stable=True)
55
+ sar = xp.take(ar, order, axis=0)
56
+ if sar.size >= 1:
57
+ bool_ar = sar[1:] != sar[:-1] if invert else sar[1:] == sar[:-1]
58
+ else:
59
+ bool_ar = xp.asarray([False]) if invert else xp.asarray([True])
60
+ flag = xp.concat((bool_ar, xp.asarray([invert], device=device_)))
61
+ ret = xp.take(flag, reverse_order, axis=0)
62
+
63
+ if assume_unique:
64
+ return ret[: x1.shape[0]]
65
+ return xp.take(ret, rev_idx, axis=0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: array-api-extra
3
- Version: 0.2.0
3
+ Version: 0.2.1.dev0
4
4
  Summary: Extra array functions built on top of the array API standard.
5
5
  Project-URL: Homepage, https://github.com/data-apis/array-api-extra
6
6
  Project-URL: Bug Tracker, https://github.com/data-apis/array-api-extra/issues
@@ -41,6 +41,7 @@ Classifier: Programming Language :: Python :: 3.12
41
41
  Classifier: Programming Language :: Python :: 3.13
42
42
  Classifier: Typing :: Typed
43
43
  Requires-Python: >=3.10
44
+ Requires-Dist: typing-extensions
44
45
  Provides-Extra: docs
45
46
  Requires-Dist: furo>=2023.08.17; extra == 'docs'
46
47
  Requires-Dist: myst-parser>=0.13; extra == 'docs'
@@ -60,6 +61,8 @@ Description-Content-Type: text/markdown
60
61
  [![docs - here!][docs-badge]][docs-link]
61
62
  [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](https://pixi.sh)
62
63
  [![All Contributors](https://img.shields.io/github/all-contributors/data-apis/array-api-extra?color=ee8449&style=flat-square)](#contributors)
64
+ [![Scientific Python Ecosystem Coordination](https://img.shields.io/badge/SPEC-0-green?labelColor=%23004811&color=%235CA038)](https://scientific-python.org/specs/)
65
+ [![codecov](https://codecov.io/github/data-apis/array-api-extra/graph/badge.svg)](https://codecov.io/github/data-apis/array-api-extra)
63
66
 
64
67
  [![PyPI version][pypi-version]][pypi-link]
65
68
  [![Conda-Forge][conda-badge]][conda-link]
@@ -84,15 +87,24 @@ Description-Content-Type: text/markdown
84
87
 
85
88
  Extra array functions built on top of the array API standard.
86
89
 
90
+ Used by:
91
+
92
+ - [SciPy](https://github.com/scipy/scipy) - Fundamental algorithms for
93
+ scientific computing.
94
+ - ...
95
+
87
96
  ## Contributors
88
97
 
98
+ This project exists thanks to the following contributors
99
+ ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
100
+
89
101
  <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
90
102
  <!-- prettier-ignore-start -->
91
103
  <!-- markdownlint-disable -->
92
104
  <table>
93
105
  <tbody>
94
106
  <tr>
95
- <td align="center" valign="top" width="14.28%"><a href="https://lucascolley.github.io/"><img src="https://avatars.githubusercontent.com/u/51488791?v=4?s=100" width="100px;" alt="Lucas Colley"/><br /><sub><b>Lucas Colley</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Code">💻</a> <a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Documentation">📖</a> <a href="#example-lucascolley" title="Examples">💡</a> <a href="#ideas-lucascolley" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-lucascolley" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-lucascolley" title="Maintenance">🚧</a> <a href="#tool-lucascolley" title="Tools">🔧</a> <a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Tests">⚠️</a> <a href="https://github.com/data-apis/array-api-extra/issues?q=author%3Alucascolley" title="Bug reports">🐛</a></td>
107
+ <td align="center" valign="top" width="14.28%"><a href="https://lucascolley.github.io/"><img src="https://avatars.githubusercontent.com/u/51488791?v=4?s=100" width="100px;" alt="Lucas Colley"/><br /><sub><b>Lucas Colley</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Code">💻</a> <a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Documentation">📖</a> <a href="#example-lucascolley" title="Examples">💡</a> <a href="#ideas-lucascolley" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-lucascolley" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-lucascolley" title="Maintenance">🚧</a> <a href="#tool-lucascolley" title="Tools">🔧</a> <a href="https://github.com/data-apis/array-api-extra/commits?author=lucascolley" title="Tests">⚠️</a> <a href="https://github.com/data-apis/array-api-extra/issues?q=author%3Alucascolley" title="Bug reports">🐛</a> <a href="#platform-lucascolley" title="Packaging/porting to new platform">📦</a></td>
96
108
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/mdhaber"><img src="https://avatars.githubusercontent.com/u/6570539?v=4?s=100" width="100px;" alt="Matt Haberland"/><br /><sub><b>Matt Haberland</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=mdhaber" title="Code">💻</a> <a href="#ideas-mdhaber" title="Ideas, Planning, & Feedback">🤔</a></td>
97
109
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/j-bowhay"><img src="https://avatars.githubusercontent.com/u/60778417?v=4?s=100" width="100px;" alt="Jake Bowhay"/><br /><sub><b>Jake Bowhay</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=j-bowhay" title="Code">💻</a> <a href="https://github.com/data-apis/array-api-extra/pulls?q=is%3Apr+reviewed-by%3Aj-bowhay" title="Reviewed Pull Requests">👀</a></td>
98
110
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/asmeurer"><img src="https://avatars.githubusercontent.com/u/71486?v=4?s=100" width="100px;" alt="Aaron Meurer"/><br /><sub><b>Aaron Meurer</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/pulls?q=is%3Apr+reviewed-by%3Aasmeurer" title="Reviewed Pull Requests">👀</a> <a href="#ideas-asmeurer" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-asmeurer" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
@@ -107,6 +119,10 @@ Extra array functions built on top of the array API standard.
107
119
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/izaid"><img src="https://avatars.githubusercontent.com/u/482179?v=4?s=100" width="100px;" alt="Irwin Zaid"/><br /><sub><b>Irwin Zaid</b></sub></a><br /><a href="#ideas-izaid" title="Ideas, Planning, & Feedback">🤔</a></td>
108
120
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/jakirkham"><img src="https://avatars.githubusercontent.com/u/3019665?v=4?s=100" width="100px;" alt="jakirkham"/><br /><sub><b>jakirkham</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=jakirkham" title="Code">💻</a> <a href="https://github.com/data-apis/array-api-extra/pulls?q=is%3Apr+reviewed-by%3Ajakirkham" title="Reviewed Pull Requests">👀</a></td>
109
121
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/tupui"><img src="https://avatars.githubusercontent.com/u/23188539?v=4?s=100" width="100px;" alt="Pamphile Roy"/><br /><sub><b>Pamphile Roy</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=tupui" title="Code">💻</a></td>
122
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/OmarManzoor"><img src="https://avatars.githubusercontent.com/u/17495884?v=4?s=100" width="100px;" alt="Omar Salman"/><br /><sub><b>Omar Salman</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=OmarManzoor" title="Code">💻</a></td>
123
+ </tr>
124
+ <tr>
125
+ <td align="center" valign="top" width="14.28%"><a href="https://ogrisel.com"><img src="https://avatars.githubusercontent.com/u/89061?v=4?s=100" width="100px;" alt="Olivier Grisel"/><br /><sub><b>Olivier Grisel</b></sub></a><br /><a href="https://github.com/data-apis/array-api-extra/commits?author=ogrisel" title="Code">💻</a></td>
110
126
  </tr>
111
127
  </tbody>
112
128
  </table>
@@ -115,3 +131,7 @@ Extra array functions built on top of the array API standard.
115
131
  <!-- prettier-ignore-end -->
116
132
 
117
133
  <!-- ALL-CONTRIBUTORS-LIST:END -->
134
+
135
+ We follow the
136
+ [all-contributors](https://github.com/all-contributors/all-contributors)
137
+ specification. Contributions of any kind welcome!
@@ -0,0 +1,10 @@
1
+ array_api_extra/__init__.py,sha256=JVGamml3JhJqEAzkjNa78kXLp1nabQxjvKKoSAvBtU0,332
2
+ array_api_extra/_funcs.py,sha256=o68LFe2YhygPGoRoe375oLfCmMQiuEmPSyaKlHkZABg,16290
3
+ array_api_extra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ array_api_extra/_lib/_compat.py,sha256=eneqQria9CVCPUw1HrtiV0s48vCSnAxeb32dYXuYiHE,5586
5
+ array_api_extra/_lib/_typing.py,sha256=tJjhePbSepxiKfU6ap71gM81deKAm9rfL7wMIHqjuFs,341
6
+ array_api_extra/_lib/_utils.py,sha256=QoUXAUzLdyNIlU76CNhPvGdgob6oDCzZwb1x0fJJABI,1948
7
+ array_api_extra-0.2.1.dev0.dist-info/METADATA,sha256=EEK5Ptp1VQP7wfpVJWO-NanCcubEw6AS9eZvTFq5XWI,12192
8
+ array_api_extra-0.2.1.dev0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
9
+ array_api_extra-0.2.1.dev0.dist-info/licenses/LICENSE,sha256=WElDmP4Uf9znamiy3s1MCM46HqI3ttZ4UAHBX4IsbtY,1097
10
+ array_api_extra-0.2.1.dev0.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from types import ModuleType
4
- from typing import Any
5
-
6
- Array = Any # To be changed to a Protocol later (see array-api#589)
7
-
8
- __all__ = ["Array", "ModuleType"]
@@ -1,8 +0,0 @@
1
- array_api_extra/__init__.py,sha256=916j5GLpulyZZsUQa-I_r510XDVbap_aIrVpCVn_PIk,266
2
- array_api_extra/_funcs.py,sha256=T5nPgBxYOb8DkNHlEM52Qf70Nf7Qb6lFtlDtuvmEk4c,14906
3
- array_api_extra/_typing.py,sha256=E3XJz5PbjXP-ckQMQLi_nOJPLr-B0cm_EVArRwY-7FY,193
4
- array_api_extra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- array_api_extra-0.2.0.dist-info/METADATA,sha256=ng-cZog84QSYi9U3zZC5vGM9FQqr01orTi_P3Dsylj8,10691
6
- array_api_extra-0.2.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
7
- array_api_extra-0.2.0.dist-info/licenses/LICENSE,sha256=WElDmP4Uf9znamiy3s1MCM46HqI3ttZ4UAHBX4IsbtY,1097
8
- array_api_extra-0.2.0.dist-info/RECORD,,