回答編集履歴
3
日本語の修正
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のようにアクセスできるクラスを追記
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'), ('
|
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
|
-
|
19
|
+
500.times {|d|
|
20
|
+
500.times {|a|
|
20
|
-
|
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
|
-
|
28
|
+
d a v
|
29
|
+
0 0 0 (1, 2, 0.0)
|
28
|
-
1 1
|
30
|
+
1 0 1 (1, 2, 1.0)
|
29
|
-
2 1
|
31
|
+
2 0 2 (1, 2, 2.0)
|
30
|
-
3 1
|
32
|
+
3 0 3 (1, 2, 3.0)
|
31
|
-
4 1
|
33
|
+
4 0 4 (1, 2, 4.0)
|
32
|
-
...
|
34
|
+
... ... ... ...
|
33
|
-
|
35
|
+
249995 499 495 (1, 2, 249995.0)
|
34
|
-
|
36
|
+
249996 499 496 (1, 2, 249996.0)
|
35
|
-
|
37
|
+
249997 499 497 (1, 2, 249997.0)
|
36
|
-
|
38
|
+
249998 499 498 (1, 2, 249998.0)
|
37
|
-
|
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
ハッシュを復元したいとの要望に対して修正
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
|
-
|
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
|
-
|
27
|
+
0 1 2 3 4 0.0
|
26
|
-
|
28
|
+
1 1 2 3 4 1.0
|
27
|
-
|
29
|
+
2 1 2 3 4 2.0
|
28
|
-
|
30
|
+
3 1 2 3 4 3.0
|
29
|
-
|
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
|
+
とすれば取り出すことができます。
|