arviz.InferenceData.stack#
- InferenceData.stack(dimensions=None, groups=None, filter_groups=None, inplace=False, **kwargs)[source]#
Perform an xarray stacking on all groups.
Stack any number of existing dimensions into a single new dimension. Loops groups to perform Dataset.stack(key=value) for every kwarg if value is a dimension of the dataset. The selection is performed on all relevant groups (like posterior, prior, sample stats) while non relevant groups like observed data are omitted. See
xarray.Dataset.stack()
- Parameters:
- dimensions
dict
, optional Names of new dimensions, and the existing dimensions that they replace.
- groups: str or list of str, optional
Groups where the selection is to be applied. Can either be group names or metagroup names.
- filter_groups{
None
, “like”, “regex”}, optional If
None
(default), interpret groups as the real group or metagroup names. If “like”, interpret groups as substrings of the real group or metagroup names. If “regex”, interpret groups as regular expressions on the real group or metagroup names. A lapandas.filter
.- inplacebool, optional
If
True
, modify the InferenceData object inplace, otherwise, return the modified copy.- kwargs
dict
, optional It must be accepted by
xarray.Dataset.stack()
.
- dimensions
- Returns:
InferenceData
A new InferenceData object by default. When
inplace==True
perform selection in-place and returnNone
See also
xarray.Dataset.stack
Stack any number of existing dimensions into a single new dimension.
unstack
Perform an xarray unstacking on all groups of InferenceData object.
Examples
Use
stack
to stack any number of existing dimensions into a single new dimension. We first check the original object:import arviz as az idata = az.load_arviz_data("rugby") idata
arviz.InferenceData-
<xarray.Dataset> Size: 452kB Dimensions: (chain: 4, draw: 500, team: 6) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 6 7 ... 493 494 495 496 497 498 499 * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' Data variables: home (chain, draw) float64 16kB ... intercept (chain, draw) float64 16kB ... atts_star (chain, draw, team) float64 96kB ... defs_star (chain, draw, team) float64 96kB ... sd_att (chain, draw) float64 16kB ... sd_def (chain, draw) float64 16kB ... atts (chain, draw, team) float64 96kB ... defs (chain, draw, team) float64 96kB ... Attributes: created_at: 2024-03-06T20:46:23.841916 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9 sampling_time: 8.503105401992798 tuning_steps: 1000
-
<xarray.Dataset> Size: 2MB Dimensions: (chain: 4, draw: 500, match: 60) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... Data variables: home_points (chain, draw, match) int64 960kB ... away_points (chain, draw, match) int64 960kB ... Attributes: created_at: 2024-03-06T20:46:25.689246 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 2MB Dimensions: (chain: 4, draw: 500, match: 60) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... Data variables: home_points (chain, draw, match) float64 960kB ... away_points (chain, draw, match) float64 960kB ... Attributes: created_at: 2024-03-06T20:46:24.120642 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 260kB Dimensions: (chain: 4, draw: 500, team: 6) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 6 7 ... 493 494 495 496 497 498 499 * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' Data variables: home (chain, draw) float64 16kB ... sd_att (chain, draw) float64 16kB ... sd_def (chain, draw) float64 16kB ... intercept (chain, draw) float64 16kB ... atts_star (chain, draw, team) float64 96kB ... defs_star (chain, draw, team) float64 96kB ... Attributes: created_at: 2024-03-06T20:46:24.377610 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 248kB Dimensions: (chain: 4, draw: 500) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 ... 495 496 497 498 499 Data variables: (12/17) max_energy_error (chain, draw) float64 16kB ... index_in_trajectory (chain, draw) int64 16kB ... smallest_eigval (chain, draw) float64 16kB ... perf_counter_start (chain, draw) float64 16kB ... largest_eigval (chain, draw) float64 16kB ... step_size (chain, draw) float64 16kB ... ... ... reached_max_treedepth (chain, draw) bool 2kB ... perf_counter_diff (chain, draw) float64 16kB ... tree_depth (chain, draw) int64 16kB ... process_time_diff (chain, draw) float64 16kB ... step_size_bar (chain, draw) float64 16kB ... energy (chain, draw) float64 16kB ... Attributes: created_at: 2024-03-06T20:46:23.854033 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9 sampling_time: 8.503105401992798 tuning_steps: 1000
-
<xarray.Dataset> Size: 116kB Dimensions: (chain: 1, draw: 500, team: 6) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 4kB 0 1 2 3 4 5 6 7 ... 493 494 495 496 497 498 499 * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' Data variables: atts_star (chain, draw, team) float64 24kB ... sd_att (chain, draw) float64 4kB ... atts (chain, draw, team) float64 24kB ... sd_def (chain, draw) float64 4kB ... defs (chain, draw, team) float64 24kB ... intercept (chain, draw) float64 4kB ... home (chain, draw) float64 4kB ... defs_star (chain, draw, team) float64 24kB ... Attributes: created_at: 2024-03-06T20:46:09.475945 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 492kB Dimensions: (chain: 1, draw: 500, match: 60) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 4kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... Data variables: away_points (chain, draw, match) int64 240kB ... home_points (chain, draw, match) int64 240kB ... Attributes: created_at: 2024-03-06T20:46:09.479330 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 9kB Dimensions: (match: 60) Coordinates: * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... Data variables: home_points (match) int64 480B ... away_points (match) int64 480B ... Attributes: created_at: 2024-03-06T20:46:09.480812 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 36kB Dimensions: (chain: 4, draw: 500) Coordinates: * chain (chain) int64 32B 0 1 2 3 * draw (draw) int64 4kB 0 1 2 3 4 5 6 7 ... 493 494 495 496 497 498 499 Data variables: sd_att (chain, draw) float64 16kB ... sd_def (chain, draw) float64 16kB ... Attributes: sd_att: pymc.logprob.transforms.LogTransform sd_def: pymc.logprob.transforms.LogTransform
In order to stack two dimensions
chain
anddraw
tosample
, we can use:idata.stack(sample=["chain", "draw"], inplace=True) idata
arviz.InferenceData-
<xarray.Dataset> Size: 496kB Dimensions: (sample: 2000, team: 6) Coordinates: * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 Data variables: home (sample) float64 16kB 0.1341 0.2025 0.2146 ... 0.1988 0.1177 intercept (sample) float64 16kB 2.949 2.907 2.888 ... 2.908 2.876 2.954 atts_star (team, sample) float64 96kB 0.3346 0.1301 ... 0.4086 0.3763 defs_star (team, sample) float64 96kB -0.4319 -0.1368 ... 0.001797 -0.4827 sd_att (sample) float64 16kB 0.3047 0.1598 0.1965 ... 0.4021 0.2962 sd_def (sample) float64 16kB 0.5739 0.4876 0.3242 ... 0.3384 0.3576 atts (team, sample) float64 96kB 0.1833 0.1542 ... 0.2989 0.3514 defs (team, sample) float64 96kB -0.09829 -0.1253 ... -0.1787 -0.2903 Attributes: created_at: 2024-03-06T20:46:23.841916 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9 sampling_time: 8.503105401992798 tuning_steps: 1000
-
<xarray.Dataset> Size: 2MB Dimensions: (match: 60, sample: 2000) Coordinates: * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 5 6 ... 494 495 496 497 498 499 Data variables: home_points (match, sample) int64 960kB 48 49 51 24 46 ... 18 23 19 22 12 away_points (match, sample) int64 960kB 12 12 8 12 6 10 ... 23 14 12 9 15 Attributes: created_at: 2024-03-06T20:46:25.689246 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 2MB Dimensions: (match: 60, sample: 2000) Coordinates: * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 5 6 ... 494 495 496 497 498 499 Data variables: home_points (match, sample) float64 960kB -9.405 -9.389 ... -3.71 -3.011 away_points (match, sample) float64 960kB -2.499 -2.552 ... -3.354 -4.934 Attributes: created_at: 2024-03-06T20:46:24.120642 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 304kB Dimensions: (sample: 2000, team: 6) Coordinates: * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 Data variables: home (sample) float64 16kB -0.9279 -0.9394 -0.942 ... -0.9387 -0.9259 sd_att (sample) float64 16kB -0.9305 -0.9221 -0.9238 ... -0.9391 -0.9299 sd_def (sample) float64 16kB -0.9601 -0.9487 -0.9321 ... -0.9333 -0.9349 intercept (sample) float64 16kB -0.9202 -0.9233 -0.9252 ... -0.9267 -0.92 atts_star (team, sample) float64 96kB -0.3334 0.5835 ... -0.5241 -0.5093 defs_star (team, sample) float64 96kB -0.6467 -0.2401 ... 0.1645 -0.8016 Attributes: created_at: 2024-03-06T20:46:24.377610 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 292kB Dimensions: (sample: 2000) Coordinates: * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 ... 495 496 497 498 499 Data variables: (12/17) max_energy_error (sample) float64 16kB -0.5529 0.4738 ... -1.006 index_in_trajectory (sample) int64 16kB -5 -15 -4 -11 ... 17 24 -28 -20 smallest_eigval (sample) float64 16kB nan nan nan nan ... nan nan nan perf_counter_start (sample) float64 16kB 9.249e+03 ... 9.251e+03 largest_eigval (sample) float64 16kB nan nan nan nan ... nan nan nan step_size (sample) float64 16kB 0.3105 0.3105 ... 0.2495 0.2495 ... ... reached_max_treedepth (sample) bool 2kB False False False ... False False perf_counter_diff (sample) float64 16kB 0.005344 0.005213 ... 0.006747 tree_depth (sample) int64 16kB 5 5 5 5 3 3 4 4 ... 5 5 3 6 6 5 5 process_time_diff (sample) float64 16kB 0.005344 0.005214 ... 0.006749 step_size_bar (sample) float64 16kB 0.2456 0.2456 ... 0.2186 0.2186 energy (sample) float64 16kB 539.7 539.7 ... 542.7 547.7 Attributes: created_at: 2024-03-06T20:46:23.854033 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9 sampling_time: 8.503105401992798 tuning_steps: 1000
-
<xarray.Dataset> Size: 124kB Dimensions: (team: 6, sample: 500) Coordinates: * team (team) <U8 192B 'Wales' 'France' 'Ireland' ... 'Italy' 'England' * sample (sample) object 4kB MultiIndex * chain (sample) int64 4kB 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 * draw (sample) int64 4kB 0 1 2 3 4 5 6 ... 493 494 495 496 497 498 499 Data variables: atts_star (team, sample) float64 24kB -0.1165 -0.6705 ... 0.9718 0.645 sd_att (sample) float64 4kB 2.205 1.604 0.6585 ... 1.116 0.9112 1.459 atts (team, sample) float64 24kB -0.4148 -0.2689 ... 1.039 0.416 sd_def (sample) float64 4kB 0.01573 0.382 0.9764 ... 0.1869 2.879 1.323 defs (team, sample) float64 24kB -0.003092 0.2726 ... -1.412 -0.3131 intercept (sample) float64 4kB 1.172 3.866 2.439 4.324 ... 2.066 1.964 3.91 home (sample) float64 4kB 0.694 -0.6541 0.4198 ... -2.354 -0.9812 defs_star (team, sample) float64 24kB 0.003231 0.4705 ... -0.7006 0.001565 Attributes: created_at: 2024-03-06T20:46:09.475945 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 500kB Dimensions: (match: 60, sample: 500) Coordinates: * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... * sample (sample) object 4kB MultiIndex * chain (sample) int64 4kB 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 * draw (sample) int64 4kB 0 1 2 3 4 5 6 ... 494 495 496 497 498 499 Data variables: away_points (match, sample) int64 240kB 135 51 9 27 4 4 ... 27 139 23 6 351 home_points (match, sample) int64 240kB 6 22 16 253 78 136 ... 30 801 5 0 1 Attributes: created_at: 2024-03-06T20:46:09.479330 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 9kB Dimensions: (match: 60) Coordinates: * match (match) <U16 4kB 'Wales Italy' ... 'Ireland England' home_team (match) <U8 2kB ... away_team (match) <U8 2kB ... Data variables: home_points (match) int64 480B ... away_points (match) int64 480B ... Attributes: created_at: 2024-03-06T20:46:09.480812 arviz_version: 0.17.0 inference_library: pymc inference_library_version: 5.10.4+7.g34d2a5d9
-
<xarray.Dataset> Size: 80kB Dimensions: (sample: 2000) Coordinates: * sample (sample) object 16kB MultiIndex * chain (sample) int64 16kB 0 0 0 0 0 0 0 0 0 0 0 ... 3 3 3 3 3 3 3 3 3 3 3 * draw (sample) int64 16kB 0 1 2 3 4 5 6 7 ... 493 494 495 496 497 498 499 Data variables: sd_att (sample) float64 16kB -1.189 -1.834 -1.627 ... -0.9111 -1.217 sd_def (sample) float64 16kB -0.5553 -0.7182 -1.126 ... -1.083 -1.028 Attributes: sd_att: pymc.logprob.transforms.LogTransform sd_def: pymc.logprob.transforms.LogTransform
We can also take the example of custom InferenceData object and perform stacking. We first check the original object:
import numpy as np datadict = { "a": np.random.randn(100), "b": np.random.randn(1, 100, 10), "c": np.random.randn(1, 100, 3, 4), } coords = { "c1": np.arange(3), "c99": np.arange(4), "b1": np.arange(10), } dims = {"c": ["c1", "c99"], "b": ["b1"]} idata = az.from_dict( posterior=datadict, posterior_predictive=datadict, coords=coords, dims=dims ) idata
arviz.InferenceData-
<xarray.Dataset> Size: 19kB Dimensions: (chain: 1, draw: 100, b1: 10, c1: 3, c99: 4) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 800B 0 1 2 3 4 5 6 7 8 ... 91 92 93 94 95 96 97 98 99 * b1 (b1) int64 80B 0 1 2 3 4 5 6 7 8 9 * c1 (c1) int64 24B 0 1 2 * c99 (c99) int64 32B 0 1 2 3 Data variables: a (chain, draw) float64 800B -0.4194 -0.4995 2.131 ... 3.071 -0.6915 b (chain, draw, b1) float64 8kB 1.471 0.01022 ... 1.425 -0.02831 c (chain, draw, c1, c99) float64 10kB 0.4651 -0.156 ... -0.9815 Attributes: created_at: 2024-04-04T21:16:33.923253+00:00 arviz_version: 0.18.0
-
<xarray.Dataset> Size: 19kB Dimensions: (chain: 1, draw: 100, b1: 10, c1: 3, c99: 4) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 800B 0 1 2 3 4 5 6 7 8 ... 91 92 93 94 95 96 97 98 99 * b1 (b1) int64 80B 0 1 2 3 4 5 6 7 8 9 * c1 (c1) int64 24B 0 1 2 * c99 (c99) int64 32B 0 1 2 3 Data variables: a (chain, draw) float64 800B -0.4194 -0.4995 2.131 ... 3.071 -0.6915 b (chain, draw, b1) float64 8kB 1.471 0.01022 ... 1.425 -0.02831 c (chain, draw, c1, c99) float64 10kB 0.4651 -0.156 ... -0.9815 Attributes: created_at: 2024-04-04T21:16:33.926881+00:00 arviz_version: 0.18.0
In order to stack two dimensions
c1
andc99
toz
, we can use:idata.stack(z=["c1", "c99"], inplace=True) idata
arviz.InferenceData-
<xarray.Dataset> Size: 20kB Dimensions: (chain: 1, draw: 100, b1: 10, z: 12) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 800B 0 1 2 3 4 5 6 7 8 ... 91 92 93 94 95 96 97 98 99 * b1 (b1) int64 80B 0 1 2 3 4 5 6 7 8 9 * z (z) object 96B MultiIndex * c1 (z) int64 96B 0 0 0 0 1 1 1 1 2 2 2 2 * c99 (z) int64 96B 0 1 2 3 0 1 2 3 0 1 2 3 Data variables: a (chain, draw) float64 800B -0.4194 -0.4995 2.131 ... 3.071 -0.6915 b (chain, draw, b1) float64 8kB 1.471 0.01022 ... 1.425 -0.02831 c (chain, draw, z) float64 10kB 0.4651 -0.156 ... 0.2948 -0.9815 Attributes: created_at: 2024-04-04T21:16:33.923253+00:00 arviz_version: 0.18.0
-
<xarray.Dataset> Size: 20kB Dimensions: (chain: 1, draw: 100, b1: 10, z: 12) Coordinates: * chain (chain) int64 8B 0 * draw (draw) int64 800B 0 1 2 3 4 5 6 7 8 ... 91 92 93 94 95 96 97 98 99 * b1 (b1) int64 80B 0 1 2 3 4 5 6 7 8 9 * z (z) object 96B MultiIndex * c1 (z) int64 96B 0 0 0 0 1 1 1 1 2 2 2 2 * c99 (z) int64 96B 0 1 2 3 0 1 2 3 0 1 2 3 Data variables: a (chain, draw) float64 800B -0.4194 -0.4995 2.131 ... 3.071 -0.6915 b (chain, draw, b1) float64 8kB 1.471 0.01022 ... 1.425 -0.02831 c (chain, draw, z) float64 10kB 0.4651 -0.156 ... 0.2948 -0.9815 Attributes: created_at: 2024-04-04T21:16:33.926881+00:00 arviz_version: 0.18.0