STUDIO TAMA


thumbnail

投稿日:2023-01-05

【Grasshopper Tips】Various Random Values

  • #Grasshopper

  • #Python

今回は色々な乱数を、Python のライブラリ, Numpy を使用して生成し、Voronoi を作成してます。乱数について勉強したものの備忘録として記事化しとくことにしました。よければご参考ください。

概要

今回は Numpy を使用して 5 種類の乱数を生成していきます。

Numpy を Grasshopper で使用するために、プラグイン GH Python Remote を使用しております。(※インストール・環境構築・使用方法は

こちら

を参照してください)

以下が Grasshopper コンポーネントの全体像です。

thumbnail

ざっくり説明しますと、

  1. Anaconda で numpy をインストールした仮想環境を構築し、GhpythonRemote で numpy を Grasshopper 側で使用できるようにしております。
  2. Ghpython コンポーネントで入力値で指定された乱数を生成して出力しています。乱数は 0 ~ 1 の範囲で(x, y)2 次元配列で生成しています。
  3. 生成した乱数を原点(0.5, 0.5)の 1×1 の正方形内に配置し、配置した点から Voronoi を作成しています。
  4. その後、Boudary Surface コンポーネントでサーフェイスを生成し、Extrude コンポーネントでz方向に押し出します。
  5. 最後に、見やすくするために白黒に色付けしてます。

python コード全体

1from ghpythonlib import treehelpers as th
2import rpyc
3import scriptcontext as sc
4np = sc.sticky['numpy']
5
6rng = np.random
7ptnum = 200
8dimension = 2
9
10def min_max(x, axis=None):
11    min = x.min(axis=axis, keepdims=True)
12    max = x.max(axis=axis, keepdims=True)
13    result = (x-min)/(max-min)
14    return result
15
16if x == 0:
17    uniform = rng.uniform(0,1,(ptnum, dimension))
18    random_type = min_max(uniform)
19elif x == 1:
20    normal = rng.normal(0,1.0,(ptnum, dimension))
21    random_type = min_max(normal)
22elif x == 2:
23    triangular = rng.triangular(0,0.5,1,(ptnum, dimension))
24    random_type = min_max(triangular)
25elif x == 3:
26    beta = rng.beta(2, 2, (ptnum, dimension))
27    random_type = min_max(beta)
28elif x == 4:
29    step = rng.choice([-0.1,0.1],ptnum)
30    random_walk = np.cumsum(step)
31
32    list = np.array([])
33    tmp_list = list.tolist()
34    step = np.arange(0, 1, 1/ptnum)
35    remap_walk = min_max(random_walk)
36
37    for x, y in zip(step, remap_walk):
38        tmp_list.append(x)
39        tmp_list.append(y)
40    np_convert_list = np.asarray(tmp_list)
41    reshape_list = np.reshape(np_convert_list, (ptnum, 2))
42    random_type = reshape_list
43
44val = rpyc.utils.classic.obtain(random_type.tolist())
45val = th.list_to_tree(val, source=[0,0])

上のコードが python コードの全体となってます。

  1. 必要なモジュールをインストール
  2. 入力端子の値によって、5 種類の乱数のうち1つ生成
  3. 乱数を 0 ~ 1 の範囲に正規化
  4. Grasshopper で使用できる形式に変換して掃き出してます。

一様分布

thumbnail

一様分布の乱数を生成した際の Voronoi です。 numpy.random.uniform を使用してます。 最も一般的な乱数で、点の位置からも満遍なくランダムな値が出力されているのがわかります。

正規分布

thumbnail

正規分布から生成する乱数。numpy.random.normal を使用しています。 わかりやすいように点の数を 500 点に増やしてます。 0.5 を平均値にしているので、点が中心によっているのがわかります。

三角形分布

thumbnail

三角形分布から生成した乱数。numpy.random.triangular  を使用してます。 こちらも、0.5 を最頻値としているので、やや中心に点がよっているのがわかります。

ベータ分布

thumbnail

ベータ分布から生成した乱数。numpy.random.beta  を使用してます。 三角形分布ほどではないですが、中心によっているのがわかります。

ランダムウォーク

thumbnail

ランダムウォークを使用した乱数。株などの値動きで見られるものになります。 x 方向は一定に増えていき、y 方向にランダムウォークの値を使用してます。

おわり

thumbnail

ランダムな値はしばしば使いますが、いろんな乱数を使用したパターンを備忘録として残しときます。

【参考】

目 次