在Ocaml中使用Bigarray

时间:2017-07-17 20:27:20

标签: numpy ocaml

我是Ocaml的新手,我正在尝试使用他https://github.com/LaurentMazare/npy-ocaml库。现在我只想打开我在python中创建的文件:

In [1]: import numpy as np

In [2]: a = np.arange(10)

In [3]: np.save("bla.npy", a)

我已经设法匹配数组的类型,但我没有从中读取任何值:

let Npy.P rarray = Npy.read_mmap "bla.npy" ~shared:false in
 begin
    match Bigarray.Genarray.layout rarray with
    | Bigarray.Fortran_layout -> assert false
    | Bigarray.C_layout ->
      match Bigarray.Genarray.kind rarray with
      | Bigarray.Float32 -> print_string "F32"
      | Bigarray.Float64 -> print_string "F64"
      | Bigarray.Int32 -> print_string "I32" 
      | Bigarray.Int64 -> print_int (rarray.get [1])
      | _ -> print_string "oohh"
 end;;

print_endline " ";;

如何访问Bigarray上的值?

2 个答案:

答案 0 :(得分:0)

要访问Genarray的值,您可以使用接受索引数组的Genarray.get函数,例如Genarray.get rarray [|1;2;3;4|]或大括号订阅语法,例如{{1} }}。

此外,看起来您的数组是一维的,因此您需要使用rarray.{1,2,3,4}构造函数,然后您可以使用Array1.get函数或订阅语法访问元素,例如,Npy.P1

答案 1 :(得分:0)

这个特殊的库似乎缺少一些实用程序函数来从无类型的打包数组中提取类型良好的bigarray。

您可以编写

这样的提取功能
let extract_c_int64 (P a) =
  match Genarray.layout a with 
  | Fortran_layout -> None
  | C_layout -> 
     match Genarray.kind a with
     | Int64 -> Some (a:(float,float64_elt,c_layout) Genarray.t)
     | _ -> None;;

如果动态类型数组实际上是具有C布局的int64数组,则返回Some a,此函数将返回None。一种可能的用途是

let a =
   match extract_c_float64 with
   | None -> raise (Invalid_argument "wrong type of array")
   | Some a-> a

提取数组后,操作数组会变得更加容易。例如,可以使用let a1111= a.{1,1,1,1}进行阅读,并且对数组的写入非常相似a.{1,2,4,5} <- 2L