Numpy 在Ocaml中使用Bigarray

Numpy 在Ocaml中使用Bigarray,numpy,ocaml,Numpy,Ocaml,我是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.Gen

我是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上的值?

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


另外,数组看起来是一维的,因此需要使用
Npy.P1
构造函数,然后可以使用函数或订阅语法(例如
rarray)访问元素。{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

一旦提取了数组,就可以更容易地操作数组。例如,可以使用
让a1111=a.{1,1,1,1}
进行读取,对数组的写入非常类似
a.{1,2,4,5}运行此代码时您看到了什么输出?我得到:文件“test.ml”,第10行,字符44-47:错误:Unbound record field getYou正在使用一种OO表示法。在OCaml中,函数来自模块而不是对象本身:
Bigarray.Array1.get rarray 1
更接近您想要的。如果我尝试rarray。{0}我得到:文件“test.ml”,第10行,字符36-42:错误:此表达式的类型为($P,$P1,$P2)Bigarray.Genarray.t,但表达式的类型应为('a,'b,'c)Bigarray.Array1.t make:**[Makefile:2:all]错误2,因为您需要使用Npy.P1而不是Npy.P进行提取。如果我尝试让
Npy.P1 rarray=Npy.read_mmap“bla.Npy”~shared:false
I get
错误:构造函数Npy.P1属于变量类型Npy.packed_array1,但预期构造函数属于变量类型Npy.packed_array1
是的,很抱歉,您还需要使用
Npy.read_mmap1
来获取
Npy.packed_array1
类型数组。该库过于复杂:(