Numpy 在Ocaml中使用Bigarray
我是Ocaml新手,我正在尝试使用这个库。现在,我只想通过以下方式打开我在python中创建的文件: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
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
类型数组。该库过于复杂:(