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.
- array_api_extra/__init__.py +4 -2
- array_api_extra/_funcs.py +66 -9
- array_api_extra/_lib/_compat.py +168 -0
- array_api_extra/_lib/_typing.py +10 -0
- array_api_extra/_lib/_utils.py +65 -0
- {array_api_extra-0.2.0.dist-info → array_api_extra-0.2.1.dev0.dist-info}/METADATA +22 -2
- array_api_extra-0.2.1.dev0.dist-info/RECORD +10 -0
- array_api_extra/_typing.py +0 -8
- array_api_extra-0.2.0.dist-info/RECORD +0 -8
- {array_api_extra-0.2.0.dist-info → array_api_extra-0.2.1.dev0.dist-info}/WHEEL +0 -0
- {array_api_extra-0.2.0.dist-info → array_api_extra-0.2.1.dev0.dist-info}/licenses/LICENSE +0 -0
array_api_extra/__init__.py
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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.
|
|
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
|
[](https://pixi.sh)
|
|
62
63
|
[](#contributors)
|
|
64
|
+
[](https://scientific-python.org/specs/)
|
|
65
|
+
[](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,,
|
array_api_extra/_typing.py
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|