回答編集履歴

3

日本語の修正

2020/07/22 18:43

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
 
100
100
 
101
- 上記を応用すると、下記のようにHashのようにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
101
+ 上記を応用すると、下記のようにHashライクにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
102
102
 
103
103
  ```python
104
104
 

2

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

2020/07/22 18:43

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  # pack('QQQQf')
16
16
 
17
- my_type = [('d', '<u8'), ('a', '<u8'), ('v0', '<u8'), ('v1', '<u8'), ('v2', '<f4')]
17
+ my_type = [('d', '<u8'), ('a', '<u8'), ('v', ('<u8, <u8, <f4'))]
18
18
 
19
19
  rows = np.fromfile('results.txt', dtype=my_type)
20
20
 
@@ -34,9 +34,13 @@
34
34
 
35
35
  File.open("results.txt", mode = "wb"){|f|
36
36
 
37
- 300000.times {|i|
37
+ 500.times {|d|
38
38
 
39
+ 500.times {|a|
40
+
39
- f.write [1, 2, 3, 4, i].pack('QQQQf')
41
+ f.write [d, a, 1, 2, d * 500 + a].pack('QQQQf')
42
+
43
+ }
40
44
 
41
45
  }
42
46
 
@@ -48,29 +52,29 @@
48
52
 
49
53
  ```terminal
50
54
 
51
- d a v0 v1 v2
55
+ d a v
52
56
 
53
- 0 1 2 3 4 0.0
57
+ 0 0 0 (1, 2, 0.0)
54
58
 
55
- 1 1 2 3 4 1.0
59
+ 1 0 1 (1, 2, 1.0)
56
60
 
57
- 2 1 2 3 4 2.0
61
+ 2 0 2 (1, 2, 2.0)
58
62
 
59
- 3 1 2 3 4 3.0
63
+ 3 0 3 (1, 2, 3.0)
60
64
 
61
- 4 1 2 3 4 4.0
65
+ 4 0 4 (1, 2, 4.0)
62
66
 
63
- ... .. .. .. .. ...
67
+ ... ... ... ...
64
68
 
65
- 299995 1 2 3 4 299995.0
69
+ 249995 499 495 (1, 2, 249995.0)
66
70
 
67
- 299996 1 2 3 4 299996.0
71
+ 249996 499 496 (1, 2, 249996.0)
68
72
 
69
- 299997 1 2 3 4 299997.0
73
+ 249997 499 497 (1, 2, 249997.0)
70
74
 
71
- 299998 1 2 3 4 299998.0
75
+ 249998 499 498 (1, 2, 249998.0)
72
76
 
73
- 299999 1 2 3 4 299999.0
77
+ 249999 499 499 (1, 2, 249999.0)
74
78
 
75
79
  ```
76
80
 
@@ -91,3 +95,81 @@
91
95
  ```
92
96
 
93
97
  とすれば取り出すことができます。
98
+
99
+
100
+
101
+ 上記を応用すると、下記のようにHashのようにアクセスできるクラスを定義できます。実際に辞書を作っている訳ではありませんので、使用時のアクセスは遅いと思います。
102
+
103
+ ```python
104
+
105
+ import numpy as np
106
+
107
+ import pandas as pd
108
+
109
+
110
+
111
+
112
+
113
+ class HashLikeObject:
114
+
115
+ class Inner:
116
+
117
+ def __init__(self, filename):
118
+
119
+ _my_type = [
120
+
121
+ ("d", "<u8"),
122
+
123
+ ("a", "<u8"),
124
+
125
+ ("v", "<u8, <u8, <f4"),
126
+
127
+ ]
128
+
129
+ self._df = pd.DataFrame(np.fromfile(filename, dtype=_my_type))
130
+
131
+
132
+
133
+ def __getitem__(self, second_index):
134
+
135
+ mask1 = self._df.d == self._first_index
136
+
137
+ mask2 = self._df.a == second_index
138
+
139
+ return self._df[mask1 & mask2].v.values[0][2]
140
+
141
+
142
+
143
+ def __init__(self, filename):
144
+
145
+ self._inner = self.Inner(filename)
146
+
147
+
148
+
149
+ def __getitem__(self, first_index):
150
+
151
+ self._inner._first_index = first_index
152
+
153
+ return self._inner
154
+
155
+
156
+
157
+
158
+
159
+ def main():
160
+
161
+ data = HashLikeObject("results.txt")
162
+
163
+ print(data[1][2])
164
+
165
+
166
+
167
+
168
+
169
+ if __name__ == "__main__":
170
+
171
+ main()
172
+
173
+
174
+
175
+ ```

1

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

2020/07/22 18:37

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -1,8 +1,10 @@
1
- Pythonなら下記のようになります。
1
+ ハッシュとは違いますが、Pythonなら下記のようになります。
2
2
 
3
3
  ```python
4
4
 
5
5
  import numpy as np
6
+
7
+ import pandas as pd
6
8
 
7
9
 
8
10
 
@@ -16,11 +18,11 @@
16
18
 
17
19
  rows = np.fromfile('results.txt', dtype=my_type)
18
20
 
21
+ df= pd.DataFrame(rows)
19
22
 
20
23
 
21
- for row in rows:
22
24
 
23
- print(row)
25
+ print(df)
24
26
 
25
27
  ```
26
28
 
@@ -46,16 +48,46 @@
46
48
 
47
49
  ```terminal
48
50
 
49
- (1, 2, 3, 4, 0.)
51
+ d a v0 v1 v2
50
52
 
51
- (1, 2, 3, 4, 1.)
53
+ 0 1 2 3 4 0.0
52
54
 
53
- (1, 2, 3, 4, 2.)
55
+ 1 1 2 3 4 1.0
54
56
 
55
- (1, 2, 3, 4, 3.)
57
+ 2 1 2 3 4 2.0
56
58
 
57
- (1, 2, 3, 4, 4.)
59
+ 3 1 2 3 4 3.0
58
60
 
61
+ 4 1 2 3 4 4.0
62
+
59
- ...
63
+ ... .. .. .. .. ...
64
+
65
+ 299995 1 2 3 4 299995.0
66
+
67
+ 299996 1 2 3 4 299996.0
68
+
69
+ 299997 1 2 3 4 299997.0
70
+
71
+ 299998 1 2 3 4 299998.0
72
+
73
+ 299999 1 2 3 4 299999.0
60
74
 
61
75
  ```
76
+
77
+ 例えばdが1でaが2の場合は
78
+
79
+ ```python
80
+
81
+ mask = (df.d == 1) & (df.a == 2)
82
+
83
+ ```
84
+
85
+ として
86
+
87
+ ```python
88
+
89
+ df[mask]
90
+
91
+ ```
92
+
93
+ とすれば取り出すことができます。