【问题标题】:Returning arrays of different dimensions from one function; is it possible in F#?从一个函数返回不同维度的数组;在 F# 中可以吗?
【发布时间】:2017-01-23 21:24:41
【问题描述】:

我正在尝试将一些 Python 转换为 F#,特别是 numpy.random.randn

该函数接受可变数量的 int 参数,并根据参数的数量返回不同维度的数组。

我相信这是不可能的,因为一个函数不能返回不同类型(int[]int[][]int[][][] 等),除非它们是有区别的联合的一部分,但要确定在提交解决方法之前。

完整性检查:

member self.differntarrays ([<ParamArray>] dimensions: Object[]) =
    match dimensions with
    | [| dim1 |] ->      
         [| 
            1 
         |]
    | [| dim1; dim2 |] -> 
        [|
           [| 2 |], 
           [| 3 |] 
        |]
    | _ -> failwith "error"

导致错误:

This expression was expected to have type  
    int    
but here has type  
    'a * 'b 

expression 是:[| 2 |], [| 3 |]
int 指的是 [| 1 |] 中的 1
1的类型与[| 2 |], [| 3 |]的类型不同

TLDR;

numpy.random.randn

numpy.random.randn(d0, d1, ..., dn)

从“标准正态”分布中返回一个(或多个)样本。

如果提供了正的、int_like 或 int-convertible 参数,则 randn 生成一个形状为 (d0, d1, ..., dn) 的数组,随机填充 从单变量“正态”(高斯)分布中采样的浮点数 均值 0 和方差 1(如果任何 d_i 是浮点数,它们是第一个 通过截断转换为整数)。随机抽样的单个浮点数 如果没有提供参数,则返回分布。

交互式 python 会话示例:

np.random.randn(1)  - array([-0.28613356])
np.random.randn(2)  - array([-1.7390449 ,  1.03585894]) 
np.random.randn(1,1)- array([[ 0.04090027]])
np.random.randn(2,3)- array([[-0.16891324,  1.05519898, 0.91673992],  
                             [ 0.86297031,  0.68029926, -1.0323683 ]])

代码用于Neural Networks and Deep Learning,由于性能原因需要可变值,因此不能选择使用不可变列表。

【问题讨论】:

标签: arrays f#


【解决方案1】:

你是对的 - 浮点数组 float[] 是与浮点数组数组不同的类型
float[][] 或二维浮点数组 float[,],因此你不能编写返回一个或其他取决于输入参数。

如果你想做类似 Python 的 rand 的事情,你可以编写一个重载方法:

type Random() = 
  static let rnd = System.Random()
  static member Rand(n) = [| for i in 1 .. n -> rnd.NextDouble() |]
  static member Rand(n1, n2) = [| for i in 1 .. n1 -> Random.Rand(n2) |]
  static member Rand(n1, n2, n3) = [| for i in 1 .. n1 -> Random.Rand(n2, n3) |]

【讨论】:

    【解决方案2】:

    虽然 Tomas 建议使用重载可能是最好的,但 .NET 数组确实共享一个公共子类型:System.Array。所以你想要的都是可能的。

    member self.differntarrays ([<ParamArray>] dimensions: Object[]) : Array =
        match dimensions with
        | [| dim1 |] ->      
             [| 
                1 
             |] :> _
        | [| dim1; dim2 |] -> 
            [|
               [| 2 |], 
               [| 3 |] 
            |] :> _
        | _ -> failwith "error"
    

    【讨论】:

    • 谢谢。我总是很欣赏不同的答案,因为它会为未来的问题带来想法并保持头脑运转。
    猜你喜欢
    • 2016-10-21
    • 2015-06-30
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多