1use std::io;
11
12use super::{Array, Shape};
13
14mod header;
15use header::{Endian, Header, HeaderDict, Type, TypeDescriptor, Version};
16
17pub(crate) const MAGIC: [u8; 6] = *b"\x93NUMPY";
19
20pub fn read_array<R>(reader: &mut R) -> io::Result<Array<f64>>
24where
25 R: io::BufRead,
26{
27 let header = Header::read(reader)?;
28 let dict = header.dict;
29
30 match (dict.type_descriptor, dict.fortran_order) {
31 (_, true) => Err(io::Error::new(
32 io::ErrorKind::InvalidData,
33 "Fortran order not supported when reading npy",
34 )),
35 (descr, false) => {
36 let values = descr.read(reader)?;
37
38 Array::new(values, Shape(dict.shape)).map_err(|_| {
39 io::Error::new(io::ErrorKind::InvalidData, "npy shape does not fit values")
40 })
41 }
42 }
43}
44
45pub fn write_array<W>(writer: &mut W, array: &Array<f64>) -> io::Result<()>
47where
48 W: io::Write,
49{
50 let header = Header::new(
51 Version::V1,
52 HeaderDict::new(
53 TypeDescriptor::new(Endian::Little, Type::F8),
54 false,
55 array.shape().as_ref().to_vec(),
56 ),
57 );
58
59 header.write(writer)?;
60
61 for v in array.iter() {
62 writer.write_all(&v.to_le_bytes())?;
63 }
64
65 Ok(())
66}