Bottleneck provides the following functions:
NumPy/SciPy | median, nanmedian, rankdata, ss, nansum, nanmin, nanmax, nanmean, nanstd, nanargmin, nanargmax |
Functions | nanrankdata, nanvar, partsort, argpartsort |
Moving window | move_sum, move_nansum, move_mean, move_nanmean, move_median, move_std, move_nanstd, move_min, move_nanmin, move_max, move_nanmax |
Fast replacements for NumPy and SciPy functions.
Median of array elements along given axis.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
This function returns the same output as NumPy’s median except when the input contains NaN.
Examples
>>> a = np.array([[10, 7, 4], [3, 2, 1]])
>>> a
array([[10, 7, 4],
[ 3, 2, 1]])
>>> bn.median(a)
3.5
>>> bn.median(a, axis=0)
array([ 6.5, 4.5, 2.5])
>>> bn.median(a, axis=1)
array([ 7., 2.])
Median of array elements along given axis ignoring NaNs.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Examples
>>> a = np.array([[np.nan, 7, 4], [3, 2, 1]])
>>> a
array([[ nan, 7., 4.],
[ 3., 2., 1.]])
>>> bn.nanmedian(a)
3.0
>> bn.nanmedian(a, axis=0)
array([ 3. , 4.5, 2.5])
>> bn.nanmedian(a, axis=1)
array([ 5.5, 2. ])
Ranks the data, dealing with ties appropriately.
Equal values are assigned a rank that is the average of the ranks that would have been otherwise assigned to all of the values within that set. Ranks begin at 1, not 0.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Examples
>>> bn.rankdata([0, 2, 2, 3])
array([ 1. , 2.5, 2.5, 4. ])
>>> bn.rankdata([[0, 2], [2, 3]])
array([ 1. , 2.5, 2.5, 4. ])
>>> bn.rankdata([[0, 2], [2, 3]], axis=0)
array([[ 1., 1.],
[ 2., 2.]])
>>> bn.rankdata([[0, 2], [2, 3]], axis=1)
array([[ 1., 2.],
[ 1., 2.]])
Sum of the square of each element along specified axis.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> a = np.array([1., 2., 5.])
>>> bn.ss(a)
30.0
And calculating along an axis:
>>> b = np.array([[1., 2., 5.], [2., 5., 6.]])
>>> bn.ss(b, axis=1)
array([ 30., 65.])
Sum of array elements along given axis ignoring NaNs.
When the input has an integer type with less precision than the default platform integer, the default platform integer is used for the accumulator and return values.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
Notes
No error is raised on overflow.
If positive or negative infinity are present the result is positive or negative infinity. But if both positive and negative infinity are present, the result is Not A Number (NaN).
Examples
>>> bn.nansum(1)
1
>>> bn.nansum([1])
1
>>> bn.nansum([1, np.nan])
1.0
>>> a = np.array([[1, 1], [1, np.nan]])
>>> bn.nansum(a)
3.0
>>> bn.nansum(a, axis=0)
array([ 2., 1.])
When positive infinity and negative infinity are present:
>>> bn.nansum([1, np.nan, np.inf])
inf
>>> bn.nansum([1, np.nan, np.NINF])
-inf
>>> bn.nansum([1, np.nan, np.inf, np.NINF])
nan
Minimum values along specified axis, ignoring NaNs.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Examples
>>> bn.nanmin(1)
1
>>> bn.nanmin([1])
1
>>> bn.nanmin([1, np.nan])
1.0
>>> a = np.array([[1, 4], [1, np.nan]])
>>> bn.nanmin(a)
1.0
>>> bn.nanmin(a, axis=0)
array([ 1., 4.])
Maximum values along specified axis, ignoring NaNs.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Examples
>>> bn.nanmax(1)
1
>>> bn.nanmax([1])
1
>>> bn.nanmax([1, np.nan])
1.0
>>> a = np.array([[1, 4], [1, np.nan]])
>>> bn.nanmax(a)
4.0
>>> bn.nanmax(a, axis=0)
array([ 1., 4.])
Mean of array elements along given axis ignoring NaNs.
float64 intermediate and return values are used for integer inputs.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
No error is raised on overflow. (The sum is computed and then the result is divided by the number of non-NaN elements.)
If positive or negative infinity are present the result is positive or negative infinity. But if both positive and negative infinity are present, the result is Not A Number (NaN).
Examples
>>> bn.nanmean(1)
1.0
>>> bn.nanmean([1])
1.0
>>> bn.nanmean([1, np.nan])
1.0
>>> a = np.array([[1, 4], [1, np.nan]])
>>> bn.nanmean(a)
2.0
>>> bn.nanmean(a, axis=0)
array([ 1., 4.])
When positive infinity and negative infinity are present:
>>> bn.nanmean([1, np.nan, np.inf])
inf
>>> bn.nanmean([1, np.nan, np.NINF])
-inf
>>> bn.nanmean([1, np.nan, np.inf, np.NINF])
nan
Standard deviation along the specified axis, ignoring NaNs.
float64 intermediate and return values are used for integer inputs.
Instead of a faster one-pass algorithm, a more stable two-pass algorithm is used.
An example of a one-pass algorithm:
>>> np.sqrt((arr*arr).mean() - arr.mean()**2)
An example of a two-pass algorithm:
>>> np.sqrt(((arr - arr.mean())**2).mean())
Note in the two-pass algorithm the mean must be found (first pass) before the squared deviation (second pass) can be found.
Parameters : | arr : array_like
axis : {int, None}, optional
ddof : int, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
If positive or negative infinity are present the result is Not A Number (NaN).
Examples
>>> bn.nanstd(1)
0.0
>>> bn.nanstd([1])
0.0
>>> bn.nanstd([1, np.nan])
0.0
>>> a = np.array([[1, 4], [1, np.nan]])
>>> bn.nanstd(a)
1.4142135623730951
>>> bn.nanstd(a, axis=0)
array([ 0., 0.])
When positive infinity or negative infinity are present NaN is returned:
>>> bn.nanstd([1, np.nan, np.inf])
nan
Indices of the minimum values along an axis, ignoring NaNs.
Parameters : | a : array_like
axis : {int, None}, optional
|
---|---|
Returns : | index_array : ndarray
|
See also
Examples
>>> a = np.array([[np.nan, 4], [2, 3]])
>>> bn.nanargmin(a)
2
>>> a.flat[1]
2.0
>>> bn.nanargmax(a, axis=0)
array([1, 1])
>>> bn.nanargmax(a, axis=1)
array([1, 0])
Indices of the maximum values along an axis, ignoring NaNs.
Parameters : | a : array_like
axis : {int, None}, optional
|
---|---|
Returns : | index_array : ndarray
|
See also
Examples
>>> a = np.array([[np.nan, 4], [2, 3]])
>>> bn.nanargmax(a)
1
>>> a.flat[1]
4.0
>>> bn.nanargmax(a, axis=0)
array([1, 0])
>>> bn.nanargmax(a, axis=1)
array([1, 1])
Miscellaneous functions.
Ranks the data, dealing with ties and NaNs appropriately.
Equal values are assigned a rank that is the average of the ranks that would have been otherwise assigned to all of the values within that set. Ranks begin at 1, not 0.
NaNs in the input array are returned as NaNs.
Parameters : | arr : array_like
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Examples
>>> bn.nanrankdata([np.nan, 2, 2, 3])
array([ nan, 1.5, 1.5, 3. ])
>>> bn.nanrankdata([[np.nan, 2], [2, 3]])
array([ nan, 1.5, 1.5, 3. ])
>>> bn.nanrankdata([[np.nan, 2], [2, 3]], axis=0)
array([[ nan, 1.],
[ 1., 2.]])
>>> bn.nanrankdata([[np.nan, 2], [2, 3]], axis=1)
array([[ nan, 1.],
[ 1., 2.]])
Variance along the specified axis, ignoring NaNs.
float64 intermediate and return values are used for integer inputs.
Instead of a faster one-pass algorithm, a more stable two-pass algorithm is used.
An example of a one-pass algorithm:
>>> np.sqrt((arr*arr).mean() - arr.mean()**2)
An example of a two-pass algorithm:
>>> np.sqrt(((arr - arr.mean())**2).mean())
Note in the two-pass algorithm the mean must be found (first pass) before the squared deviation (second pass) can be found.
Parameters : | arr : array_like
axis : {int, None}, optional
ddof : int, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
If positive or negative infinity are present the result is Not A Number (NaN).
Examples
>>> bn.nanvar(1)
0.0
>>> bn.nanvar([1])
0.0
>>> bn.nanvar([1, np.nan])
0.0
>>> a = np.array([[1, 4], [1, np.nan]])
>>> bn.nanvar(a)
2.0
>>> bn.nanvar(a, axis=0)
array([ 0., 0.])
When positive infinity or negative infinity are present NaN is returned:
>>> bn.nanvar([1, np.nan, np.inf])
nan
Partial sorting of array elements along given axis.
A partially sorted array is one in which the n smallest values appear (in any order) in the first n elements. The remaining largest elements are also unordered. Due to the algorithm used (Wirth’s method), the nth smallest element is in its sorted position (at index n-1).
Shuffling the input array may change the output. The only guarantee is that the first n elements will be the n smallest and the remaining element will appear in the remainder of the output.
This functions is not protected against NaN. Therefore, you may get unexpected results if the input contains NaN.
Parameters : | arr : array_like
n : int
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
Unexpected results may occur if the input array contains NaN.
Examples
Create a numpy array:
>>> a = np.array([1, 0, 3, 4, 2])
Partially sort array so that the first 3 elements are the smallest 3 elements (note, as in this example, that the smallest 3 elements may not be sorted):
>>> bn.partsort(a, n=3)
array([1, 0, 2, 4, 3])
Return indices that would partially sort an array.
A partially sorted array is one in which the n smallest values appear (in any order) in the first n elements. The remaining largest elements are also unordered. Due to the algorithm used (Wirth’s method), the nth smallest element is in its sorted position (at index n-1).
Shuffling the input array may change the output. The only guarantee is that the first n elements will be the n smallest and the remaining element will appear in the remainder of the output.
This functions is not protected against NaN. Therefore, you may get unexpected results if the input contains NaN.
Parameters : | arr : array_like
n : int
axis : {int, None}, optional
|
---|---|
Returns : | y : ndarray
|
See also
Notes
Unexpected results may occur if the input array contains NaN.
Examples
Create a numpy array:
>>> a = np.array([1, 0, 3, 4, 2])
Find the indices that partially sort that array so that the first 3 elements are the smallest 3 elements:
>>> index = bn.argpartsort(a, n=3)
>>> index
array([0, 1, 4, 3, 2])
Let’s use the indices to partially sort the array (note, as in this example, that the smallest 3 elements may not be in order):
>>> a[index]
array([1, 0, 2, 4, 3])
Moving window functions with a 1d window.
Moving window sum along the specified axis.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_sum(arr, window=2)
array([ nan, 3., 5., 7.])
Moving window sum along the specified axis, ignoring NaNs.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_nansum(arr, window=2)
array([ nan, 3., 5., 7.])
Moving window mean along the specified axis.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_mean(arr, window=2)
array([ nan, 1.5, 2.5, 3.5])
Moving window mean along the specified axis, ignoring NaNs.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_nanmean(arr, window=2)
array([ nan, 1.5, 2.5, 3.5])
Moving window median along the specified axis.
This functions is not protected against NaN. Therefore, you may get unexpected results if the input contains NaN.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Notes
Unexpected results may occur if the input array contains NaN.
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_median(arr, window=2)
array([ nan, 1.5, 2.5, 3.5])
Moving window standard deviation along the specified axis.
Unlike bn.nanstd, which uses a more rubust two-pass algorithm, move_std uses a faster one-pass algorithm.
An example of a one-pass algorithm:
>>> np.sqrt((arr*arr).mean() - arr.mean()**2)
An example of a two-pass algorithm:
>>> np.sqrt(((arr - arr.mean())**2).mean())
Note in the two-pass algorithm the mean must be found (first pass) before the squared deviation (second pass) can be found.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_std(arr, window=2)
array([ nan, 1.5, 2.5, 3.5])
Moving window standard deviation along the specified axis, ignoring NaNs.
Unlike bn.nanstd, which uses a more rubust two-pass algorithm, move_nanstd uses a faster one-pass algorithm.
An example of a one-pass algorithm:
>>> np.sqrt((arr*arr).mean() - arr.mean()**2)
An example of a two-pass algorithm:
>>> np.sqrt(((arr - arr.mean())**2).mean())
Note in the two-pass algorithm the mean must be found (first pass) before the squared deviation (second pass) can be found.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 3.0, 4.0])
>>> bn.move_nanstd(arr, window=2)
array([ nan, 1.5, 2.5, 3.5])
Moving window minimum along the specified axis.
float64 output is returned for all input data types.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 4.0, 3.0])
>>> bn.move_min(arr, window=2)
array([ nan, 1., 2., 3.])
Moving window minimum along the specified axis, ignoring NaNs.
float64 output is returned for all input data types.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 4.0, 3.0])
>>> bn.move_nanmin(arr, window=2)
array([ nan, 2., 4., 4.])
Moving window maximum along the specified axis.
float64 output is returned for all input data types.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 4.0, 3.0])
>>> bn.move_max(arr, window=2)
array([ nan, 2., 4., 4.])
Moving window maximum along the specified axis, ignoring NaNs.
float64 output is returned for all input data types.
Parameters : | arr : ndarray
window : int
axis : int, optional
|
---|---|
Returns : | y : ndarray
|
Examples
>>> arr = np.array([1.0, 2.0, 4.0, 3.0])
>>> bn.move_nanmax(arr, window=2)
array([ nan, 2., 4., 4.])