NumPy is a large library used everywhere in scientific computing. That's why breaking backwards-compatibility comes at a significant cost and is almost always avoided, even if the API of some methods is arguably lacking. This package provides drop-in wrappers "fixing" those.
scipyx does the same for SciPy.
If you have a fix for a NumPy method that can't go upstream for some reason, feel free to PR here.
import npx
import numpy as np
a = np.random.rand(3, 4, 5)
b = np.random.rand(5, 2, 2)
out = npx.dot(a, b)
# out.shape == (3, 4, 2, 2)
Forms the dot product between the last axis of a
and the first axis of b
.
(Not the second-last axis of b
as numpy.dot(a, b)
.)
import npx
import numpy as np
A = np.random.rand(3, 3)
b = np.random.rand(3, 10, 4)
out = npx.solve(A, b)
# out.shape == (3, 10, 4)
Solves a linear equation system with a matrix of shape (n, n)
and an array of shape
(n, ...)
. The output has the same shape as the second argument.
npx.sum_at(a, idx, minlength=0)
npx.add_at(out, idx, a)
Returns an array with entries of a
summed up at indices idx
with a minimum length of
minlength
. idx
can have any shape as long as it's matching a
. The output shape is
(minlength,...)
.
The numpy equivalent numpy.add.at
is much
slower:
Relevant issue reports:
import npx
a = [0.1, 0.15, 0.7]
a_unique = npx.unique(a, tol=2.0e-1)
assert all(a_unique == [0.1, 0.7])
npx's unique()
works just like NumPy's, except that it provides a parameter
tol
(default 0.0
) which allows the user to set a tolerance. The real line
is essentially partitioned into bins of size tol
and at most one
representative of each bin is returned.
import npx
import numpy as np
a = np.random.randint(0, 5, size=(100, 2))
npx.unique_rows(a, return_inverse=False, return_counts=False)
Returns the unique rows of the integer array a
. The numpy alternative np.unique(a, axis=0)
is slow.
Relevant issue reports:
import npx
import numpy as np
a = [[0, 1], [0, 2]]
b = np.random.randint(0, 5, size=(100, 2))
npx.isin_rows(a, b)
Returns a boolean array of length len(a)
specifying if the rows a[k]
appear in b
.
Similar to NumPy's own np.isin
which only works for scalars.
import npx
a = [1.0, 2.0, 5.0]
npx.mean(a, p=3)
Returns the generalized mean of a
given list. Handles the cases +-np.inf
(max/min) and0
(geometric mean) correctly.
Also does well for large p
.
Relevant NumPy issues:
This software is published under the BSD-3-Clause license.