🍾 Xarray is now 10 years old! 🎉

xarray.cross

Contents

xarray.cross#

xarray.cross(a, b, *, dim)[source]#

Compute the cross product of two (arrays of) vectors.

The cross product of a and b in \(R^3\) is a vector perpendicular to both a and b. The vectors in a and b are defined by the values along the dimension dim and can have sizes 1, 2 or 3. Where the size of either a or b is 1 or 2, the remaining components of the input vector is assumed to be zero and the cross product calculated accordingly. In cases where both input vectors have dimension 2, the z-component of the cross product is returned.

Parameters:
  • a, b (DataArray or Variable) – Components of the first and second vector(s).

  • dim (hashable) – The dimension along which the cross product will be computed. Must be available in both vectors.

Examples

Vector cross-product with 3 dimensions:

>>> a = xr.DataArray([1, 2, 3])
>>> b = xr.DataArray([4, 5, 6])
>>> xr.cross(a, b, dim="dim_0")
<xarray.DataArray (dim_0: 3)> Size: 24B
array([-3,  6, -3])
Dimensions without coordinates: dim_0

Vector cross-product with 2 dimensions, returns in the perpendicular direction:

>>> a = xr.DataArray([1, 2])
>>> b = xr.DataArray([4, 5])
>>> xr.cross(a, b, dim="dim_0")
<xarray.DataArray ()> Size: 8B
array(-3)

Vector cross-product with 3 dimensions but zeros at the last axis yields the same results as with 2 dimensions:

>>> a = xr.DataArray([1, 2, 0])
>>> b = xr.DataArray([4, 5, 0])
>>> xr.cross(a, b, dim="dim_0")
<xarray.DataArray (dim_0: 3)> Size: 24B
array([ 0,  0, -3])
Dimensions without coordinates: dim_0

One vector with dimension 2:

>>> a = xr.DataArray(
...     [1, 2],
...     dims=["cartesian"],
...     coords=dict(cartesian=(["cartesian"], ["x", "y"])),
... )
>>> b = xr.DataArray(
...     [4, 5, 6],
...     dims=["cartesian"],
...     coords=dict(cartesian=(["cartesian"], ["x", "y", "z"])),
... )
>>> xr.cross(a, b, dim="cartesian")
<xarray.DataArray (cartesian: 3)> Size: 24B
array([12, -6, -3])
Coordinates:
  * cartesian  (cartesian) <U1 12B 'x' 'y' 'z'

One vector with dimension 2 but coords in other positions:

>>> a = xr.DataArray(
...     [1, 2],
...     dims=["cartesian"],
...     coords=dict(cartesian=(["cartesian"], ["x", "z"])),
... )
>>> b = xr.DataArray(
...     [4, 5, 6],
...     dims=["cartesian"],
...     coords=dict(cartesian=(["cartesian"], ["x", "y", "z"])),
... )
>>> xr.cross(a, b, dim="cartesian")
<xarray.DataArray (cartesian: 3)> Size: 24B
array([-10,   2,   5])
Coordinates:
  * cartesian  (cartesian) <U1 12B 'x' 'y' 'z'

Multiple vector cross-products. Note that the direction of the cross product vector is defined by the right-hand rule:

>>> a = xr.DataArray(
...     [[1, 2, 3], [4, 5, 6]],
...     dims=("time", "cartesian"),
...     coords=dict(
...         time=(["time"], [0, 1]),
...         cartesian=(["cartesian"], ["x", "y", "z"]),
...     ),
... )
>>> b = xr.DataArray(
...     [[4, 5, 6], [1, 2, 3]],
...     dims=("time", "cartesian"),
...     coords=dict(
...         time=(["time"], [0, 1]),
...         cartesian=(["cartesian"], ["x", "y", "z"]),
...     ),
... )
>>> xr.cross(a, b, dim="cartesian")
<xarray.DataArray (time: 2, cartesian: 3)> Size: 48B
array([[-3,  6, -3],
       [ 3, -6,  3]])
Coordinates:
  * time       (time) int64 16B 0 1
  * cartesian  (cartesian) <U1 12B 'x' 'y' 'z'

Cross can be called on Datasets by converting to DataArrays and later back to a Dataset:

>>> ds_a = xr.Dataset(dict(x=("dim_0", [1]), y=("dim_0", [2]), z=("dim_0", [3])))
>>> ds_b = xr.Dataset(dict(x=("dim_0", [4]), y=("dim_0", [5]), z=("dim_0", [6])))
>>> c = xr.cross(
...     ds_a.to_dataarray("cartesian"),
...     ds_b.to_dataarray("cartesian"),
...     dim="cartesian",
... )
>>> c.to_dataset(dim="cartesian")
<xarray.Dataset> Size: 24B
Dimensions:  (dim_0: 1)
Dimensions without coordinates: dim_0
Data variables:
    x        (dim_0) int64 8B -3
    y        (dim_0) int64 8B 6
    z        (dim_0) int64 8B -3

See also

numpy.cross

Corresponding numpy function