回答編集履歴

2

説明追加

2021/02/28 11:08

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -1,10 +1,12 @@
1
- エラーになるでしょう。
1
+ その場合はエラーになるでしょう。
2
2
 
3
3
 
4
4
 
5
5
  ~~何がしたいのでしょうか?~~
6
6
 
7
7
 
8
+
9
+ numpyの場合で考えます。
8
10
 
9
11
  x @ y とします。
10
12
 
@@ -17,3 +19,55 @@
17
19
  x @ y は (x.shape[0], y.shape[1])の形状を持つ行列積になります。
18
20
 
19
21
  x.shape[1]とy.shape[0]が等しくなければエラーになります。
22
+
23
+
24
+
25
+ より一般的に言うと、
26
+
27
+ ```explanation
28
+
29
+ @演算子があるとpythonインタプリタは__matmul__を呼び出します。
30
+
31
+ 従って@演算子が何をするかはクラスの定義次第です。
32
+
33
+ ```
34
+
35
+ 以下に例を示します。
36
+
37
+
38
+
39
+ ```python
40
+
41
+ >>> class fake_int(int):
42
+
43
+ ... def __matmul__(self, x):
44
+
45
+ ... return (self + x)/2
46
+
47
+ ...
48
+
49
+ >>> x = fake_int(2)
50
+
51
+ >>> y = fake_int(3)
52
+
53
+ >>>
54
+
55
+ >>> print(x @ y)
56
+
57
+ 2.5
58
+
59
+ ```
60
+
61
+
62
+
63
+ ```explanation
64
+
65
+ ここではfake_intつまり偽整数のクラスを定義しました。
66
+
67
+ @が平均値を出すように定義しておいたので、結果は2.5になっています。
68
+
69
+ 上記のnumpyの場合はで書いたことは、numpyのndarrayには__matmul__メソッドが
70
+
71
+ そういうふうに定義されているからです。
72
+
73
+ ```

1

追加

2021/02/28 11:08

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -2,4 +2,18 @@
2
2
 
3
3
 
4
4
 
5
- 何がしたいのでしょうか?
5
+ ~~何がしたいのでしょうか?~~
6
+
7
+
8
+
9
+ x @ y とします。
10
+
11
+ x と y の一方がスカラーである場合はエラーになります。
12
+
13
+ x と y が同じ長さの一次元配列であれば内積になりますが、長さが違うとエラーになります。
14
+
15
+ x と y が二次元配列で、x.shape[1]とy.shape[0]が等しければ、
16
+
17
+ x @ y は (x.shape[0], y.shape[1])の形状を持つ行列積になります。
18
+
19
+ x.shape[1]とy.shape[0]が等しくなければエラーになります。