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

回答編集履歴

3

日本語の修正

2020/07/22 18:43

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -48,7 +48,7 @@
48
48
  ```
49
49
  とすれば取り出すことができます。
50
50
 
51
- 上記を応用すると、下記のようにHashのようにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
51
+ 上記を応用すると、下記のようにHashライクにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
52
52
  ```python
53
53
  import numpy as np
54
54
  import pandas as pd

2

Hashのようにアクセスできるクラスを追記

2020/07/22 18:43

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  # Q: unsigned long long (little endian, 64bit long long)
7
7
  # f: IEEE754, little endian, 32bit single precision
8
8
  # pack('QQQQf')
9
- my_type = [('d', '<u8'), ('a', '<u8'), ('v0', '<u8'), ('v1', '<u8'), ('v2', '<f4')]
9
+ my_type = [('d', '<u8'), ('a', '<u8'), ('v', ('<u8, <u8, <f4'))]
10
10
  rows = np.fromfile('results.txt', dtype=my_type)
11
11
  df= pd.DataFrame(rows)
12
12
 
@@ -16,25 +16,27 @@
16
16
  試験用に次のようなスクリプトを書きました。
17
17
  ```ruby
18
18
  File.open("results.txt", mode = "wb"){|f|
19
- 300000.times {|i|
19
+ 500.times {|d|
20
+ 500.times {|a|
20
- f.write [1, 2, 3, 4, i].pack('QQQQf')
21
+ f.write [d, a, 1, 2, d * 500 + a].pack('QQQQf')
22
+ }
21
23
  }
22
24
  }
23
25
  ```
24
26
  上記のPythonスクリプトを実行すると下記のように表示されます。
25
27
  ```terminal
26
- d a v0 v1 v2
27
- 0 1 2 3 4 0.0
28
+ d a v
29
+ 0 0 0 (1, 2, 0.0)
28
- 1 1 2 3 4 1.0
30
+ 1 0 1 (1, 2, 1.0)
29
- 2 1 2 3 4 2.0
31
+ 2 0 2 (1, 2, 2.0)
30
- 3 1 2 3 4 3.0
32
+ 3 0 3 (1, 2, 3.0)
31
- 4 1 2 3 4 4.0
33
+ 4 0 4 (1, 2, 4.0)
32
- ... .. .. .. .. ...
34
+ ... ... ... ...
33
- 299995 1 2 3 4 299995.0
35
+ 249995 499 495 (1, 2, 249995.0)
34
- 299996 1 2 3 4 299996.0
36
+ 249996 499 496 (1, 2, 249996.0)
35
- 299997 1 2 3 4 299997.0
37
+ 249997 499 497 (1, 2, 249997.0)
36
- 299998 1 2 3 4 299998.0
38
+ 249998 499 498 (1, 2, 249998.0)
37
- 299999 1 2 3 4 299999.0
39
+ 249999 499 499 (1, 2, 249999.0)
38
40
  ```
39
41
  例えばdが1でaが2の場合は
40
42
  ```python
@@ -44,4 +46,43 @@
44
46
  ```python
45
47
  df[mask]
46
48
  ```
47
- とすれば取り出すことができます。
49
+ とすれば取り出すことができます。
50
+
51
+ 上記を応用すると、下記のようにHashのようにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
52
+ ```python
53
+ import numpy as np
54
+ import pandas as pd
55
+
56
+
57
+ class HashLikeObject:
58
+ class Inner:
59
+ def __init__(self, filename):
60
+ _my_type = [
61
+ ("d", "<u8"),
62
+ ("a", "<u8"),
63
+ ("v", "<u8, <u8, <f4"),
64
+ ]
65
+ self._df = pd.DataFrame(np.fromfile(filename, dtype=_my_type))
66
+
67
+ def __getitem__(self, second_index):
68
+ mask1 = self._df.d == self._first_index
69
+ mask2 = self._df.a == second_index
70
+ return self._df[mask1 & mask2].v.values[0][2]
71
+
72
+ def __init__(self, filename):
73
+ self._inner = self.Inner(filename)
74
+
75
+ def __getitem__(self, first_index):
76
+ self._inner._first_index = first_index
77
+ return self._inner
78
+
79
+
80
+ def main():
81
+ data = HashLikeObject("results.txt")
82
+ print(data[1][2])
83
+
84
+
85
+ if __name__ == "__main__":
86
+ main()
87
+
88
+ ```

1

ハッシュを復元したいとの要望に対して修正

2020/07/22 18:37

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -1,15 +1,16 @@
1
- Pythonなら下記のようになります。
1
+ ハッシュとは違いますが、Pythonなら下記のようになります。
2
2
  ```python
3
3
  import numpy as np
4
+ import pandas as pd
4
5
 
5
6
  # Q: unsigned long long (little endian, 64bit long long)
6
7
  # f: IEEE754, little endian, 32bit single precision
7
8
  # pack('QQQQf')
8
9
  my_type = [('d', '<u8'), ('a', '<u8'), ('v0', '<u8'), ('v1', '<u8'), ('v2', '<f4')]
9
10
  rows = np.fromfile('results.txt', dtype=my_type)
11
+ df= pd.DataFrame(rows)
10
12
 
11
- for row in rows:
12
- print(row)
13
+ print(df)
13
14
  ```
14
15
 
15
16
  試験用に次のようなスクリプトを書きました。
@@ -22,10 +23,25 @@
22
23
  ```
23
24
  上記のPythonスクリプトを実行すると下記のように表示されます。
24
25
  ```terminal
26
+ d a v0 v1 v2
25
- (1, 2, 3, 4, 0.)
27
+ 0 1 2 3 4 0.0
26
- (1, 2, 3, 4, 1.)
28
+ 1 1 2 3 4 1.0
27
- (1, 2, 3, 4, 2.)
29
+ 2 1 2 3 4 2.0
28
- (1, 2, 3, 4, 3.)
30
+ 3 1 2 3 4 3.0
29
- (1, 2, 3, 4, 4.)
31
+ 4 1 2 3 4 4.0
30
- ...
32
+ ... .. .. .. .. ...
33
+ 299995 1 2 3 4 299995.0
34
+ 299996 1 2 3 4 299996.0
35
+ 299997 1 2 3 4 299997.0
36
+ 299998 1 2 3 4 299998.0
37
+ 299999 1 2 3 4 299999.0
31
- ```
38
+ ```
39
+ 例えばdが1でaが2の場合は
40
+ ```python
41
+ mask = (df.d == 1) & (df.a == 2)
42
+ ```
43
+ として
44
+ ```python
45
+ df[mask]
46
+ ```
47
+ とすれば取り出すことができます。