teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

d

2018/12/26 04:53

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -47,4 +47,36 @@
47
47
  plt.show()
48
48
  ```
49
49
 
50
- ![イメージ説明](ff68ec122b14c228d09af673a62b2a21.png)
50
+ ![イメージ説明](ff68ec122b14c228d09af673a62b2a21.png)
51
+
52
+ ## 追記
53
+
54
+ 速度ごとの各方角の割合を出したい場合は以下のようにしてください。
55
+
56
+ ```python
57
+ # 速度の割合
58
+ sum_along_speed = H.sum(axis=0) # 速度ごとの総和
59
+ orient_ratio = np.divide(
60
+ H, sum_along_speed,
61
+ out=np.zeros(H.shape, dtype=float),
62
+ where=sum_along_speed != 0)
63
+
64
+ # H.sum(axis=0) は列 (速度) ごとの総和なので、形状は (速度の数,)
65
+ # H の形状は (方角の数, 速度の数) なので、numpy のブロードキャストにより、各速度ごとの方向の割合が出る。
66
+ sns.heatmap(orient_ratio, annot=True, cmap='Reds', fmt='.1%',
67
+ xticklabels=xlabels, yticklabels=ylabels, cbar=False)
68
+ plt.show()
69
+ ```
70
+
71
+ ![イメージ説明](fd70e5c8570caa75df89eb9d4e5bab82.png)
72
+
73
+ ```
74
+ np.divide(
75
+ H, sum_along_speed,
76
+ out=np.zeros(H.shape, dtype=float),
77
+ where=sum_along_speed != 0)
78
+ ```
79
+
80
+ 0割り (division by zero) が発生すると、数学ではこのような演算は定義されないので、結果は NaN になります。
81
+ そのため、`where=sum_along_speed != 0` で割る数`sum_along_speed`の値が0でない要素だけ除算するようにします。
82
+ 割る数が0の場合は、結果も0とするので、`out=np.zeros(H.shape, dtype=float)`としています。