Skip to contents

Multiplies array elements along the specified axes. A boolean array is multiplied as zeroes and ones, like base::prod() does.

Usage

nv_prod(x, axes = NULL, drop = TRUE, nan_rm = FALSE)

# S3 method for class 'AnvlArray'
prod(..., na.rm = FALSE)

Arguments

x

(arrayish)
One input. Can be any data type. An R value materializes at its default data type.

axes

(integer() | NULL)
Axes to reduce over. Negative values count from the end, i.e. -1 refers to the last axis. If NULL (default), reduces over all axes.

drop

(logical(1))
Whether to drop the reduced axes: removed from the output shape if TRUE, set to 1 if FALSE.

nan_rm

(logical(1))
How to handle NaN values in float inputs. If FALSE (default), NaN propagates. If TRUE, NaN values are skipped.

...

(arrayish)
The arrays to reduce, and, when there is only one, further named arguments of nv_prod(), such as axes.

na.rm

(logical(1))
Forwarded to nv_prod()'s nan_rm argument.

Value

(arrayish)
Has the input's data type, except a boolean input, which is accumulated at the default integer data type (see default_dtypes()). The shape is the input's with the reduced axes removed (drop = TRUE) or set to 1 (drop = FALSE).

The prod() generic

prod() reduces over all axes and, like base::prod(), takes several data arguments: prod(x, y) is the product of both arrays. na.rm becomes nan_rm. Beyond base R, named arguments are passed on, so prod(x, axes = 1L) reduces a single axis – but only when x is the only data argument.

See also

prim_prod() for the underlying primitive.

Examples

x <- nv_matrix(1:6, nrow = 2)
# no axes given: reduce over all of them
nv_prod(x)
#> AnvlArray
#>  720
#> [ CPUi32{} ] 

# reducing axis 1 removes it, drop = FALSE keeps it at size 1
nv_prod(x, axes = 1L)
#> AnvlArray
#>   2
#>  12
#>  30
#> [ CPUi32{3} ] 
nv_prod(x, axes = 1L, drop = FALSE)
#> AnvlArray
#>   2 12 30
#> [ CPUi32{1,3} ] 

# negative axes count from the end
nv_prod(x, axes = -1L)
#> AnvlArray
#>  15
#>  48
#> [ CPUi32{2} ] 

# NaN propagates unless nan_rm = TRUE
nv_prod(nv_array(c(2, NaN, 3)))
#> AnvlArray
#>  nan
#> [ CPUf32{} ] 
nv_prod(nv_array(c(2, NaN, 3)), nan_rm = TRUE)
#> AnvlArray
#>  6
#> [ CPUf32{} ]