66242


RubyのNArrayに関する質問です。

NArrayで下のようなグラフを描いて遊んでいるとします。  
しかし、NArrayにはNumPyの `meshgrid` に相当する機能がないみたいです。  
そこで似たようなことを実現するために、下のようなコードを書きましたが、少し冗長に見えます。

なにかもっと良さそうな書き方を知っていたら教えてください。

[code]

    require 'gr/plot'
    
    _x = Numo::DFloat.linspace(-2, 2, 40)
    _y = Numo::DFloat.linspace(0, Math::PI, 20)
    x = (_x.expand_dims(0) * Numo::DFloat.ones(_y.size, 1)).flatten
    y = (_y.expand_dims(1) * Numo::DFloat.ones(1, _x.size)).flatten
    z = (Numo::NMath.sin(x) + Numo::NMath.cos(y))
    
    GR.contour(x, y, z)
    
[/code]

追記：下のようなのも考えました。

[code]

    z = Numo::NMath.sin(_x) + Numo::NMath.cos(_y).expand_dims(0).transpose
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/iTfMz.png)](https://i.stack.imgur.com/iTfMz.png)


CC BY-SA 4.0
2020-05-03T06:20:08.927
66237
2020-05-03T08:38:44.810
32772
question
ruby narray
Numo::NArrayのmeshgrid


本質的な差異はありませんが、`meshgrid()` を `Numo::NArray` クラスのクラスメソッドとして定義するのはどうでしょうか。

[code]

    require 'numo/narray'
    require 'gr/plot'
    
    class Numo::NArray
      def self.meshgrid(*v)
        raise(ArgumentError, 'Expected at least 2 arrays.') if v.size < 2
        return \
          (v[0].expand_dims(0) * Numo::DFloat.ones(v[1].size, 1)).flatten,
          (v[1].expand_dims(1) * Numo::DFloat.ones(1, v[0].size)).flatten
      end
    end
    
    x = Numo::DFloat.linspace(-2, 2, 40)
    y = Numo::DFloat.linspace(0, Math::PI, 20)
    x, y = Numo::NArray.meshgrid(x, y)
    z = Numo::NMath.sin(x) + Numo::NMath.cos(y)
    
    GR.contour(x, y, z)
    
[/code]


CC BY-SA 4.0
2020-05-03T08:38:44.810
66242
2020-05-03T08:38:44.810
66237
answer