Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
For example, :code:`dtype`. Note that :code:`out` isn't supported.
>>> s4 = s.reduce(np.add, axis=1, dtype=np.float16)
>>> s4.dtype
dtype('float16')
By default, this reduces the array by only the first axis.
>>> s.reduce(np.add)
"""
axis = normalize_axis(axis, self.ndim)
zero_reduce_result = method.reduce([self.fill_value, self.fill_value], **kwargs)
reduce_super_ufunc = None
if not equivalent(zero_reduce_result, self.fill_value):
reduce_super_ufunc = _reduce_super_ufunc.get(method, None)
if reduce_super_ufunc is None:
raise ValueError(
"Performing this reduction operation would produce "
"a dense result: %s" % str(method)
)
if axis is None:
axis = tuple(range(self.ndim))
if not isinstance(axis, tuple):
axis = (axis,)
axis = tuple(a if a >= 0 else a + self.ndim for a in axis)
m_arg += 1
else:
func_args.append(arg.fill_value)
# Try our best to preserve the output dtype.
try:
func_data = self.func(*func_args, dtype=self.dtype, **self.kwargs)
except TypeError:
try:
func_args = np.broadcast_arrays(*func_args)
out = np.empty(func_args[0].shape, dtype=self.dtype)
func_data = self.func(*func_args, out=out, **self.kwargs)
except TypeError:
func_data = self.func(*func_args, **self.kwargs).astype(self.dtype)
unmatched_mask = ~equivalent(func_data, self.fill_value)
if not unmatched_mask.any():
return None
func_coords = matched_arrays[0].coords[:, unmatched_mask]
func_data = func_data[unmatched_mask]
if matched_arrays[0].shape != self.shape:
params = _get_broadcast_parameters(matched_arrays[0].shape, self.shape)
func_coords, func_data = _get_expanded_coords_data(
func_coords, func_data, params, self.shape
)
if all(m is None or m for m in mask):
return func_coords, func_data
def _prune(self):
"""
Prunes data so that if any fill-values are present, they are removed
from both coordinates and data.
Examples
--------
>>> coords = np.array([[0, 1, 2, 3]])
>>> data = np.array([1, 0, 1, 2])
>>> s = COO(coords, data)
>>> s._prune()
>>> s.nnz
3
"""
mask = ~equivalent(self.data, self.fill_value)
self.coords = self.coords[:, mask]
self.data = self.data[mask]
# If string, this is an index into an np.void
# Custom dtype.
if isinstance(index, str):
data = x.data[index]
idx = np.where(data)
data = data[idx].flatten()
coords = list(x.coords[:, idx[0]])
coords.extend(idx[1:])
fill_value_idx = np.asarray(x.fill_value[index]).flatten()
fill_value = (
fill_value_idx[0] if fill_value_idx.size else _zero_of_dtype(data.dtype)[()]
)
if not equivalent(fill_value, fill_value_idx).all():
raise ValueError("Fill-values in the array are inconsistent.")
return COO(
coords,
data,
shape=x.shape + x.data.dtype[index].shape,
has_duplicates=False,
sorted=True,
fill_value=fill_value,
)
# Otherwise, convert into a tuple.
if not isinstance(index, tuple):
index = (index,)
# Check if the last index is an ellipsis.
fill_value_array = self.func(*zero_args, dtype=self.dtype, **self.kwargs)
self.dtype = None
except TypeError:
fill_value_array = self.func(*zero_args, **self.kwargs)
try:
fill_value = fill_value_array[(0,) * fill_value_array.ndim]
except IndexError:
zero_args = tuple(
arg.fill_value if isinstance(arg, COO) else _zero_of_dtype(arg.dtype)
for arg in self.args
)
fill_value = self.func(*zero_args, **self.kwargs)[()]
if (
not equivalent(fill_value, fill_value_array).all()
and self.shape != self.ndarray_shape
):
raise ValueError(
"Performing a mixed sparse-dense operation that would result in a dense array. "
"Please make sure that func(sparse_fill_values, ndarrays) is a constant array."
)
# Store dtype separately if needed.
if self.dtype is not None:
fill_value = fill_value.astype(self.dtype)
self.fill_value = fill_value
self.dtype = self.fill_value.dtype