array_write_read_ndarray/
array_write_read_ndarray.rs1#![allow(missing_docs)]
2
3use ndarray::{array, Array2, ArrayD};
4use rayon::iter::{IntoParallelIterator, ParallelIterator};
5use zarrs::storage::{
6 storage_adapter::usage_log::UsageLogStorageAdapter, ReadableWritableListableStorage,
7};
8
9fn array_write_read() -> Result<(), Box<dyn std::error::Error>> {
10 use std::sync::Arc;
11 use zarrs::{
12 array::{DataType, ZARR_NAN_F32},
13 array_subset::ArraySubset,
14 node::Node,
15 storage::store,
16 };
17
18 let mut store: ReadableWritableListableStorage = Arc::new(store::MemoryStore::new());
26 if let Some(arg1) = std::env::args().collect::<Vec<_>>().get(1) {
27 if arg1 == "--usage-log" {
28 let log_writer = Arc::new(std::sync::Mutex::new(
29 std::io::stdout(),
31 ));
33 store = Arc::new(UsageLogStorageAdapter::new(store, log_writer, || {
34 chrono::Utc::now().format("[%T%.3f] ").to_string()
35 }));
36 }
37 }
38
39 zarrs::group::GroupBuilder::new()
41 .build(store.clone(), "/")?
42 .store_metadata()?;
43
44 let group_path = "/group";
46 let mut group = zarrs::group::GroupBuilder::new().build(store.clone(), group_path)?;
47 group
48 .attributes_mut()
49 .insert("foo".into(), serde_json::Value::String("bar".into()));
50 group.store_metadata()?;
51
52 println!(
53 "The group metadata is:\n{}\n",
54 group.metadata().to_string_pretty()
55 );
56
57 let array_path = "/group/array";
59 let array = zarrs::array::ArrayBuilder::new(
60 vec![8, 8], vec![4, 4], DataType::Float32,
63 ZARR_NAN_F32,
64 )
65 .dimension_names(["y", "x"].into())
67 .build(store.clone(), array_path)?;
69
70 array.store_metadata()?;
72
73 println!(
74 "The array metadata is:\n{}\n",
75 array.metadata().to_string_pretty()
76 );
77
78 (0..2).into_par_iter().try_for_each(|i| {
80 let chunk_indices: Vec<u64> = vec![0, i];
81 let chunk_subset = array.chunk_grid().subset(&chunk_indices)?.ok_or_else(|| {
82 zarrs::array::ArrayError::InvalidChunkGridIndicesError(chunk_indices.to_vec())
83 })?;
84 array.store_chunk_ndarray(
85 &chunk_indices,
86 ArrayD::<f32>::from_shape_vec(
87 chunk_subset.shape_usize(),
88 vec![i as f32 * 0.1; chunk_subset.num_elements() as usize],
89 )
90 .unwrap(),
91 )
92 })?;
93
94 let subset_all = array.subset_all();
95 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
96 println!("store_chunk [0, 0] and [0, 1]:\n{data_all:+4.1}\n");
97
98 let ndarray_chunks: Array2<f32> = array![
100 [1.0, 1.0, 1.0, 1.0, 1.1, 1.1, 1.1, 1.1,],
101 [1.0, 1.0, 1.0, 1.0, 1.1, 1.1, 1.1, 1.1,],
102 [1.0, 1.0, 1.0, 1.0, 1.1, 1.1, 1.1, 1.1,],
103 [1.0, 1.0, 1.0, 1.0, 1.1, 1.1, 1.1, 1.1,],
104 ];
105 array.store_chunks_ndarray(&ArraySubset::new_with_ranges(&[1..2, 0..2]), ndarray_chunks)?;
106 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
107 println!("store_chunks [1..2, 0..2]:\n{data_all:+4.1}\n");
108
109 let ndarray_subset: Array2<f32> =
111 array![[-3.3, -3.4, -3.5,], [-4.3, -4.4, -4.5,], [-5.3, -5.4, -5.5],];
112 array.store_array_subset_ndarray(
113 ArraySubset::new_with_ranges(&[3..6, 3..6]).start(),
114 ndarray_subset,
115 )?;
116 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
117 println!("store_array_subset [3..6, 3..6]:\n{data_all:+4.1}\n");
118
119 let ndarray_subset: Array2<f32> = array![
121 [-0.6],
122 [-1.6],
123 [-2.6],
124 [-3.6],
125 [-4.6],
126 [-5.6],
127 [-6.6],
128 [-7.6],
129 ];
130 array.store_array_subset_ndarray(
131 ArraySubset::new_with_ranges(&[0..8, 6..7]).start(),
132 ndarray_subset,
133 )?;
134 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
135 println!("store_array_subset [0..8, 6..7]:\n{data_all:+4.1}\n");
136
137 let ndarray_chunk_subset: Array2<f32> = array![[-7.4, -7.5, -7.6, -7.7],];
139 array.store_chunk_subset_ndarray(
140 &[1, 1],
142 ArraySubset::new_with_ranges(&[3..4, 0..4]).start(),
144 ndarray_chunk_subset,
145 )?;
146 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
147 println!("store_chunk_subset [3..4, 0..4] of chunk [1, 1]:\n{data_all:+4.1}\n");
148
149 array.erase_chunk(&[0, 0])?;
151 let data_all = array.retrieve_array_subset_ndarray::<f32>(&subset_all)?;
152 println!("erase_chunk [0, 0]:\n{data_all:+4.1}\n");
153
154 let chunk_indices = vec![0, 1];
156 let data_chunk = array.retrieve_chunk_ndarray::<f32>(&chunk_indices)?;
157 println!("retrieve_chunk [0, 1]:\n{data_chunk:+4.1}\n");
158
159 let chunks = ArraySubset::new_with_ranges(&[0..2, 1..2]);
161 let data_chunks = array.retrieve_chunks_ndarray::<f32>(&chunks)?;
162 println!("retrieve_chunks [0..2, 1..2]:\n{data_chunks:+4.1}\n");
163
164 let subset = ArraySubset::new_with_ranges(&[2..6, 3..5]); let data_subset = array.retrieve_array_subset_ndarray::<f32>(&subset)?;
167 println!("retrieve_array_subset [2..6, 3..5]:\n{data_subset:+4.1}\n");
168
169 let node = Node::open(&store, "/").unwrap();
171 let tree = node.hierarchy_tree();
172 println!("hierarchy_tree:\n{}", tree);
173
174 Ok(())
175}
176
177fn main() {
178 if let Err(err) = array_write_read() {
179 println!("{:?}", err);
180 }
181}