In [1]:
#use "topfind";;
#require "bigarray";;
open Bigarray;;


- : unit = ()
Findlib has been successfully loaded. Additional directives:
  #require "package";;      to load a package
  #list;;                   to list the available packages
  #camlp4o;;                to load camlp4 (standard syntax)
  #camlp4r;;                to load camlp4 (revised syntax)
  #predicates "p,q,...";;   to set these predicates
  Topfind.reset();;         to force that packages will be reloaded
  #thread;;                 to enable threads

- : unit = ()
/home/andyman/.opam/4.01.0-test/lib/ocaml/unix.cma: loaded
/home/andyman/.opam/4.01.0-test/lib/ocaml/bigarray.cma: loaded

Array1

Basic Array1 get/set functions


In [2]:
let len = 10
let b1 = Array1.create int c_layout len
let () = for i=0 to len-1 do b1.{i} <- (i+1)*3 done
let a1 = Array.init len (fun i -> b1.{i})


Out[2]:
val len : int = 10
Out[2]:
val b1 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>
Out[2]:
val a1 : int array = [|3; 6; 9; 12; 15; 18; 21; 24; 27; 30|]

Array2

Basic Array2 get/set functions using floats.


In [3]:
let len1, len2 = 2, 3
let b2 = Array2.create float32 c_layout len1 len2
let () = 
    for i=0 to len1-1 do 
        for j=0 to len2-1 do 
            b2.{i,j} <- (float j *. 0.5) +. float i 
        done
    done
let a2 = Array.init len2 (fun j -> Array.init len1 (fun i -> b2.{i,j}))


Out[3]:
val len1 : int = 2
val len2 : int = 3
Out[3]:
val b2 : (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array2.t =
  <abstr>
Out[3]:
val a2 : float array array = [|[|0.; 1.|]; [|0.5; 1.5|]; [|1.; 2.|]|]

Array3

Basic Array3 get/set functions using int32


In [4]:
let len1, len2, len3 = 2, 3, 4
let b3 = Array3.create int32 c_layout len1 len2 len3
let () = 
    for i=0 to len1-1 do 
        for j=0 to len2-1 do 
            for k=0 to len3-1 do 
                b3.{i,j,k} <- Int32.(add (mul (of_int k) 100l) (add (mul (of_int j) 10l) (of_int i))) 
            done
        done
    done
let a3 = Array.init len3 (fun k -> Array.init len2 (fun j -> Array.init len1 (fun i -> b3.{i,j,k})))


Out[4]:
val len1 : int = 2
val len2 : int = 3
val len3 : int = 4
Out[4]:
val b3 : (int32, Bigarray.int32_elt, Bigarray.c_layout) Bigarray.Array3.t =
  <abstr>
Out[4]:
val a3 : int32 array array array =
  [|[|[|0l; 1l|]; [|10l; 11l|]; [|20l; 21l|]|];
    [|[|100l; 101l|]; [|110l; 111l|]; [|120l; 121l|]|];
    [|[|200l; 201l|]; [|210l; 211l|]; [|220l; 221l|]|];
    [|[|300l; 301l|]; [|310l; 311l|]; [|320l; 321l|]|]|]

Genarray

Basic Genarray get/set functions

Start off with a very basic Genarray test


In [5]:
let b = Genarray.create int c_layout [|2;2|]
let _ = Genarray.set b [|0;0|] 1, Genarray.set b [|0;1|] 2, Genarray.set b [|1;0|] 3, Genarray.set b [|1;1|] 4
let x = Genarray.get b [|0;0|], Genarray.get b [|0;1|], Genarray.get b [|1;0|], Genarray.get b [|1;1|]


Out[5]:
val b : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Genarray.t =
  <abstr>
Out[5]:
- : unit * unit * unit * unit = ((), (), (), ())
Out[5]:
val x : int * int * int * int = (1, 2, 3, 4)

Make a Genarray with more complex dimensions. The incr function creates all the indices over the Genarray. The index is hashed, stored in the array an xor'ed together. When the array is read the hash is recomputed.


In [6]:
let dims = [| 2; 3; 4; 2; 3; 4; 2; 3; 4 |]

let incr x = 
    let rec f i = 
        if x.(i)+1 = dims.(i) then (x.(i) <- 0; f (i+1)) 
        else (x.(i) <- x.(i)+1;) 
    in
    f 0 
  
let bn = Genarray.create int c_layout dims
let size = Array.fold_left ( * ) 1 dims 

let hash = 
    let h = ref 0 in
    let idx = Array.map (fun _ -> 0) dims in
    for i=0 to size-1 do 
        let h' = Hashtbl.hash idx in
        Genarray.set bn idx h';
        h := !h lxor h';
        (try incr idx with _ -> ());
    done;
    !h

let hash_get = 
    let h = ref 0 in
    let idx = Array.map (fun _ -> 0) dims in
    for i=0 to size-1 do 
        h := !h lxor (Genarray.get bn idx);
        (try incr idx with _ -> ());
    done;
    !h


Out[6]:
val dims : int array = [|2; 3; 4; 2; 3; 4; 2; 3; 4|]
Out[6]:
val incr : int array -> unit = <fun>
Out[6]:
val bn : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Genarray.t =
  <abstr>
Out[6]:
val size : int = 13824
Out[6]:
val hash : int = 312082685
Out[6]:
val hash_get : int = 312082685

Index exceptions

Check for index out of bounds exceptions


In [7]:
let exn f i = try f i |> ignore; false with x when x = Invalid_argument("index out of bounds") -> true | _ -> false


Out[7]:
val exn : ('a -> 'b) -> 'a -> bool = <fun>

In [8]:
let ok1 = 
    let x = exn (Array1.get b1) in 
    x (-100) && x (-1) && x 10 && x 100
let ok2 = 
    let x = exn (fun (i,j) -> Array2.get b2 i j) in 
    x (-1,0) && x (0,-1) && x (-10,-10) && x (0,3) && x (2,0) && x (2,3)
let ok3 = 
    let x = exn (fun (i,j,k) -> Array3.get b3 i j k) in 
    x (-1,0,0) && x (0,-1,0) && x (0,0,-1) && x (-10,-10,-10) && 
    x (2,0,0) && x (0,3,0) && x (0,0,4) &&  x (10,20,30)


Out[8]:
val ok1 : bool = true
Out[8]:
val ok2 : bool = true
Out[8]:
val ok3 : bool = true

fortran_layout


In [9]:
let len = 10
let b1 = Array1.create int fortran_layout len
let () = for i=1 to len do b1.{i} <- i*2 done
let a1 = Array.init len (fun i -> b1.{i+1})


Out[9]:
val len : int = 10
Out[9]:
val b1 : (int, Bigarray.int_elt, Bigarray.fortran_layout) Bigarray.Array1.t =
  <abstr>
Out[9]:
val a1 : int array = [|2; 4; 6; 8; 10; 12; 14; 16; 18; 20|]

In [10]:
let len1, len2 = 2, 3
let b2 = Genarray.create float32 fortran_layout [|len1; len2|]
let () = 
    for i=1 to len1 do 
        for j=1 to len2 do 
            Genarray.set b2 [|i; j|] ((float j *. 0.5) +. float i) 
        done
    done
let a2 = Array.init len2 (fun j -> Array.init len1 (fun i -> Genarray.get b2 [|i+1;j+1|]))


Out[10]:
val len1 : int = 2
val len2 : int = 3
Out[10]:
val b2 :
  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =
  <abstr>
Out[10]:
val a2 : float array array = [|[|1.5; 2.5|]; [|2.; 3.|]; [|2.5; 3.5|]|]

fill


In [11]:
let b = Array1.create int16_unsigned c_layout 4
let () = Array1.fill b 0x1_ffff
let a = Array.init 4 (Array1.get b)


Out[11]:
val b :
  (int, Bigarray.int16_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>
Out[11]:
val a : int array = [|65535; 65535; 65535; 65535|]

In [12]:
let b = Genarray.create int fortran_layout [|2;2;2|]
let () = Genarray.fill b (-2)
let a = Array.init 2 (fun k -> Array.init 2 (fun j -> Array.init 2 (fun i -> Genarray.get b [|i+1;j+1;k+1|])))


Out[12]:
val b : (int, Bigarray.int_elt, Bigarray.fortran_layout) Bigarray.Genarray.t =
  <abstr>
Out[12]:
val a : int array array array =
  [|[|[|-2; -2|]; [|-2; -2|]|]; [|[|-2; -2|]; [|-2; -2|]|]|]

blit


In [13]:
let b = Array1.create int16_unsigned c_layout 4
let () = Array1.fill b 0xbeef
let c = Array1.create int16_unsigned c_layout 4
let () = Array1.blit b c
let a = Array.init 4 (Array1.get c)


Out[13]:
val b :
  (int, Bigarray.int16_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>
Out[13]:
val c :
  (int, Bigarray.int16_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>
Out[13]:
val a : int array = [|48879; 48879; 48879; 48879|]

Generic arrays

Test all array layouts/kinds using Genarray over various dimensions.


In [14]:
(* generic arrays *)
module type B = sig
    type t 
    type elt
    val kind : (t,elt) Bigarray.kind
    val rand : unit -> t
    val equal : t -> t -> bool
    val name : string
end
module type D = sig
    val dims : int array
end
module TestGenarray(B : B)(D : D) = struct

    let size = Array.fold_left ( * ) 1 D.dims
    let rand_init() = Random.init 1000

    let c_layout = (c_layout,0)
    let fortran_layout = (fortran_layout,1)
    
    (* multi-dimensional indices *)
    let mk_idx (_,ofs) = Array.map (fun _ -> ofs) D.dims
    let incr (_,ofs) x = 
        let rec f i = 
            if x.(i) = D.dims.(i)-(1-ofs) then (x.(i) <- ofs; f (i+1)) 
            else (x.(i) <- x.(i)+1;) 
        in
        try f 0 with _ -> ()
        
    let test layout =
        let ba = Genarray.create B.kind (fst layout) D.dims in
        let ba2 = Genarray.create B.kind (fst layout) D.dims in
        
        (* write random gunk *)
        let idx,() = mk_idx layout, rand_init() in
        for i=0 to size-1 do
            Genarray.set ba idx (B.rand());
            incr layout idx
        done;
        (* read back and check *)
        let idx,() = mk_idx layout, rand_init() in
        for i=0 to size-1 do
            let r = B.rand() in
            let a = Genarray.get ba idx in
            assert (B.equal r a);
            incr layout idx
        done;
        
        (* blit to new array *)
        let () = Genarray.blit ba ba2 in

        (* fill 1st array with random value *)
        let x = B.rand() in
        let () = Genarray.fill ba x in
        (* read back and check *)
        let idx = mk_idx layout in
        for i=0 to size-1 do
            let a = Genarray.get ba idx in
            assert (B.equal x a);
            incr layout idx
        done;

        (* read back 2nd array check *)
        let idx,() = mk_idx layout, rand_init() in
        for i=0 to size-1 do
            let r = B.rand() in
            let a = Genarray.get ba2 idx in
            assert (B.equal r a);
            incr layout idx
        done
        
    
    
    let run () = 
        (*let () = Printf.printf "%s\n" B.name in*)
        let () = test c_layout in
        let () = test fortran_layout in
        ()

end


Out[14]:
module type B =
  sig
    type t
    type elt
    val kind : (t, elt) Bigarray.kind
    val rand : unit -> t
    val equal : t -> t -> bool
    val name : string
  end
Out[14]:
module type D = sig val dims : int array end
Out[14]:
module TestGenarray :
  functor (B : B) ->
    functor (D : D) ->
      sig
        val size : int
        val rand_init : unit -> unit
        val c_layout : Bigarray.c_layout Bigarray.layout * int
        val fortran_layout : Bigarray.fortran_layout Bigarray.layout * int
        val mk_idx : 'a * 'b -> 'b array
        val incr : 'a * int -> int array -> unit
        val test : 'a Bigarray.layout * int -> unit
        val run : unit -> unit
      end

In [15]:
module Int = struct
    type t = int
    type elt = Bigarray.int_elt
    let kind = Bigarray.int
    let rand () = Random.int 1000
    let equal a b = Pervasives.compare a b = 0
    let name = "int"
end
module Int32 = struct
    type t = int32
    type elt = Bigarray.int32_elt
    let kind = Bigarray.int32
    let rand () = Random.int32 1000l
    let equal a b = Pervasives.compare a b = 0
    let name = "int32"
end
module Int64 = struct
    type t = int64
    type elt = Bigarray.int64_elt
    let kind = Bigarray.int64
    let rand () = Random.int64 1000L
    let equal a b = Pervasives.compare a b = 0
    let name = "int64"
end
module Char_ = struct
    type t = char
    type elt = Bigarray.int8_unsigned_elt
    let kind = Bigarray.char
    let rand () = Char.chr (Random.int 256)
    let equal a b = Pervasives.compare a b = 0
    let name = "char"
end
module Uint8 = struct
    type t = int
    type elt = Bigarray.int8_unsigned_elt
    let kind = Bigarray.int8_unsigned
    let rand () = Random.int 256
    let equal a b = Pervasives.compare a b = 0
    let name = "uint8"
end
module Sint8 = struct
    type t = int
    type elt = Bigarray.int8_signed_elt
    let kind = Bigarray.int8_signed
    let rand () = Random.int 128
    let equal a b = Pervasives.compare a b = 0
    let name = "sint8"
end
module Uint16 = struct
    type t = int
    type elt = Bigarray.int16_unsigned_elt
    let kind = Bigarray.int16_unsigned
    let rand () = Random.int 1000
    let equal a b = Pervasives.compare a b = 0
    let name = "uin16"
end
module Sint16 = struct
    type t = int
    type elt = Bigarray.int16_signed_elt
    let kind = Bigarray.int16_signed
    let rand () = Random.int 1000
    let equal a b = Pervasives.compare a b = 0
    let name = "sint16"
end
module Float32 = struct
    type t = float
    type elt = Bigarray.float32_elt
    let kind = Bigarray.float32
    let rand () = Random.float 1000.
    let equal a b = abs_float (a -. b) < 0.0001
    let name = "float32"
end
module Float64 = struct
    type t = float
    type elt = Bigarray.float64_elt
    let kind = Bigarray.float64
    let rand () = Random.float 1000.
    let equal a b = Pervasives.compare a b = 0
    let name = "float64"
end
module Complex32 = struct
    type t = Complex.t
    type elt = Bigarray.complex32_elt
    let kind = Bigarray.complex32
    let rand () = Complex.({re=Random.float 1000.;im=Random.float 1000.})
    let equal a b = 
        let open Complex in
        Float32.equal a.re b.re &&
        Float32.equal a.im b.im
    let name = "complex32"
end
module Complex64 = struct
    type t = Complex.t
    type elt = Bigarray.complex64_elt
    let kind = Bigarray.complex64
    let rand () = Complex.({re=Random.float 1000.;im=Random.float 1000.})
    let equal a b = Pervasives.compare a b = 0
    let name = "complex64"
end

let ba_types = [
    (module Int : B);
    (module Int32 : B);
    (module Int64 : B);
    (module Char_ : B);
    (module Uint8 : B);
    (module Sint8 : B);
    (module Uint16 : B);
    (module Sint16 : B);
    (module Float32 : B);
    (module Float64 : B);
    (module Complex32 : B);
    (module Complex64 : B);
]


Out[15]:
module Int :
  sig
    type t = int
    type elt = Bigarray.int_elt
    val kind : (int, Bigarray.int_elt) Bigarray.kind
    val rand : unit -> int
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Int32 :
  sig
    type t = int32
    type elt = Bigarray.int32_elt
    val kind : (int32, Bigarray.int32_elt) Bigarray.kind
    val rand : unit -> Int32.t
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Int64 :
  sig
    type t = int64
    type elt = Bigarray.int64_elt
    val kind : (int64, Bigarray.int64_elt) Bigarray.kind
    val rand : unit -> Int64.t
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Char_ :
  sig
    type t = char
    type elt = Bigarray.int8_unsigned_elt
    val kind : (char, Bigarray.int8_unsigned_elt) Bigarray.kind
    val rand : unit -> char
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Uint8 :
  sig
    type t = int
    type elt = Bigarray.int8_unsigned_elt
    val kind : (int, Bigarray.int8_unsigned_elt) Bigarray.kind
    val rand : unit -> int
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Sint8 :
  sig
    type t = int
    type elt = Bigarray.int8_signed_elt
    val kind : (int, Bigarray.int8_signed_elt) Bigarray.kind
    val rand : unit -> int
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Uint16 :
  sig
    type t = int
    type elt = Bigarray.int16_unsigned_elt
    val kind : (int, Bigarray.int16_unsigned_elt) Bigarray.kind
    val rand : unit -> int
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Sint16 :
  sig
    type t = int
    type elt = Bigarray.int16_signed_elt
    val kind : (int, Bigarray.int16_signed_elt) Bigarray.kind
    val rand : unit -> int
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Float32 :
  sig
    type t = float
    type elt = Bigarray.float32_elt
    val kind : (float, Bigarray.float32_elt) Bigarray.kind
    val rand : unit -> float
    val equal : float -> float -> bool
    val name : string
  end
Out[15]:
module Float64 :
  sig
    type t = float
    type elt = Bigarray.float64_elt
    val kind : (float, Bigarray.float64_elt) Bigarray.kind
    val rand : unit -> float
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
module Complex32 :
  sig
    type t = Complex.t
    type elt = Bigarray.complex32_elt
    val kind : (Complex.t, Bigarray.complex32_elt) Bigarray.kind
    val rand : unit -> Complex.t
    val equal : Complex.t -> Complex.t -> bool
    val name : string
  end
Out[15]:
module Complex64 :
  sig
    type t = Complex.t
    type elt = Bigarray.complex64_elt
    val kind : (Complex.t, Bigarray.complex64_elt) Bigarray.kind
    val rand : unit -> Complex.t
    val equal : 'a -> 'a -> bool
    val name : string
  end
Out[15]:
val ba_types : (module B) list =
  [<module>; <module>; <module>; <module>; <module>; <module>; <module>;
   <module>; <module>; <module>; <module>; <module>]

Check generation of indices is working correctly


In [16]:
module X = TestGenarray(Int)(struct let dims = [| 2;3 |] end)
let idx = X.mk_idx X.c_layout
let c = Array.init (2*3) (fun _ -> let a = Array.copy idx in X.incr X.c_layout idx; a)
let idx = X.mk_idx X.fortran_layout
let fortran = Array.init (2*3) (fun _ -> let a = Array.copy idx in X.incr X.fortran_layout idx; a)


Out[16]:
module X :
  sig
    val size : int
    val rand_init : unit -> unit
    val c_layout : Bigarray.c_layout Bigarray.layout * int
    val fortran_layout : Bigarray.fortran_layout Bigarray.layout * int
    val mk_idx : 'a * 'b -> 'b array
    val incr : 'a * int -> int array -> unit
    val test : 'a Bigarray.layout * int -> unit
    val run : unit -> unit
  end
Out[16]:
val idx : int array = [|0; 0|]
Out[16]:
val c : int array array =
  [|[|0; 0|]; [|1; 0|]; [|0; 1|]; [|1; 1|]; [|0; 2|]; [|1; 2|]|]
Out[16]:
val idx : int array = [|1; 1|]
Out[16]:
val fortran : int array array =
  [|[|1; 1|]; [|2; 1|]; [|1; 2|]; [|2; 2|]; [|1; 3|]; [|2; 3|]|]

Run tests. An exception is raised if there is an error


In [17]:
let dims = List.map (fun d -> (module (struct let dims = [| 100 |] end) : D)) 
    [
        [|1|];
        [|10|];
        [|10000|];
        [|1;1|];
        [|10;20|];
        [|100;200|];
        [|1;1;1|];
        [|10;8;12|];
        [|12;20;14;6;2;1;4|];
    ]
    
let test ba dims = 
    let module Test = TestGenarray((val ba : B))((val dims : D)) in
    Test.run()
    
let _ = List.iter (fun ba -> List.iter (fun d -> test ba d) dims) ba_types


Out[17]:
val dims : (module D) list =
  [<module>; <module>; <module>; <module>; <module>; <module>; <module>;
   <module>; <module>]
Out[17]:
val test : (module B) -> (module D) -> unit = <fun>
Out[17]:
- : unit = ()

Sub arrays


In [18]:
let ba = Array2.of_array int c_layout [|
  [| 0; 1 |];
  [| 2; 3 |];
  [| 4; 5 |];
  [| 6; 7 |];
|]


Out[18]:
val ba : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array2.t =
  <abstr>

extract middle 2 rows


In [19]:
let ba2 = Array2.sub_left ba 1 2


Out[19]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array2.t =
  <abstr>

In [20]:
ba2.{0,0}, ba2.{0,1}, ba2.{1,0}, ba2.{1,1}


Out[20]:
- : int * int * int * int = (2, 3, 4, 5)

Ensure both arrays share data


In [21]:
ba2.{0,0} <- 100


Out[21]:
- : unit = ()

In [22]:
ba.{1,0}


Out[22]:
- : int = 100

Fortran layout


In [23]:
let ba = Array2.of_array int fortran_layout [|
  [| 0; 1 |];
  [| 2; 3 |];
  [| 4; 5 |];
  [| 6; 7 |];
|]


Out[23]:
val ba : (int, Bigarray.int_elt, Bigarray.fortran_layout) Bigarray.Array2.t =
  <abstr>

extract right hand column


In [24]:
let ba2 = Array2.sub_right ba 2 1


Out[24]:
val ba2 : (int, Bigarray.int_elt, Bigarray.fortran_layout) Bigarray.Array2.t =
  <abstr>

In [25]:
Array.init 4 (fun i -> ba2.{i+1,1})


Out[25]:
- : int array = [|1; 3; 5; 7|]

In [26]:
ba2.{3,1} <- 50


Out[26]:
- : unit = ()

In [27]:
ba.{3,2}


Out[27]:
- : int = 50

Slicing arrays


In [28]:
let ba = Array3.of_array int c_layout [|
    [| [| 0; 1 |]; [| 2; 3 |]; |];
    [| [| 4; 5 |]; [| 6; 7 |]; |];
|]


Out[28]:
val ba : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array3.t =
  <abstr>

get the [2,3] subarray


In [29]:
let ba2 = Array3.slice_left_1 ba 0 1


Out[29]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>

In [30]:
ba2.{0}, ba2.{1}


Out[30]:
- : int * int = (2, 3)

get the [4,5] subarray


In [31]:
let ba2 = Array3.slice_left_1 ba 1 0


Out[31]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>

In [32]:
ba2.{0}, ba2.{1}


Out[32]:
- : int * int = (4, 5)

get [[4,5][6,7]]


In [33]:
let ba2 = Array3.slice_left_2 ba 1


Out[33]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array2.t =
  <abstr>

In [34]:
ba2.{0,0}, ba2.{0,1}, ba2.{1,0}, ba2.{1,1}


Out[34]:
- : int * int * int * int = (4, 5, 6, 7)

Reshaping


In [35]:
let ba = Array2.of_array int c_layout [|
    [| 0; 1; 2; 3 |];
    [| 4; 5; 6; 7 |];
|]


Out[35]:
val ba : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array2.t =
  <abstr>

2d to 1d


In [36]:
let ba2 = reshape_1 (genarray_of_array2 ba) 8


Out[36]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array1.t =
  <abstr>

In [37]:
Array.init 8 (fun i -> ba2.{i})


Out[37]:
- : int array = [|0; 1; 2; 3; 4; 5; 6; 7|]

2d to 3d


In [38]:
let ba2 = array3_of_genarray (reshape (genarray_of_array2 ba) [|2;2;2|])


Out[38]:
val ba2 : (int, Bigarray.int_elt, Bigarray.c_layout) Bigarray.Array3.t =
  <abstr>

In [39]:
ba2.{0,0,0}, ba2.{0,0,1}, ba2.{0,1,0}, ba2.{0,1,1}, 
ba2.{1,0,0}, ba2.{1,0,1}, ba2.{1,1,0}, ba2.{1,1,1}


Out[39]:
- : int * int * int * int * int * int * int * int = (0, 1, 2, 3, 4, 5, 6, 7)

In [ ]: