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

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)>
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 ()>
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)>
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)>
array([12, -6, -3])
Coordinates:
* cartesian  (cartesian) <U1 '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)>
array([-10,   2,   5])
Coordinates:
* cartesian  (cartesian) <U1 '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)>
array([[-3,  6, -3],
[ 3, -6,  3]])
Coordinates:
* time       (time) int64 0 1
* cartesian  (cartesian) <U1 '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_array("cartesian"), ds_b.to_array("cartesian"), dim="cartesian"
... )
>>> c.to_dataset(dim="cartesian")
<xarray.Dataset>
Dimensions:  (dim_0: 1)
Dimensions without coordinates: dim_0
Data variables:
x        (dim_0) int64 -3
y        (dim_0) int64 6
z        (dim_0) int64 -3


numpy.cross