質問編集履歴

3

実行速度を測った結果を追記

2019/09/16 04:35

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -73,3 +73,75 @@
73
73
 
74
74
 
75
75
  Python 3.7.1
76
+
77
+
78
+
79
+ ### 追記
80
+
81
+
82
+
83
+ hayataka2049さんに教えてもらった方法と私が考えた方法の実行速度を比べた結果を載せておきます。
84
+
85
+
86
+
87
+ ```python
88
+
89
+ import numpy as np
90
+
91
+ import itertools
92
+
93
+ from timeit import timeit
94
+
95
+
96
+
97
+ arr = np.random.randint(3, size=100, dtype='uint8') # 実際に想定しているdata量
98
+
99
+
100
+
101
+
102
+
103
+ def method_me(arr):
104
+
105
+ return np.array(
106
+
107
+ tuple(itertools.chain.from_iterable(
108
+
109
+ itertools.repeat(index, value)
110
+
111
+ for index, value in enumerate(arr)
112
+
113
+ )),
114
+
115
+ dtype=np.uint8
116
+
117
+ )
118
+
119
+
120
+
121
+ def method_hayataka(arr):
122
+
123
+ return np.repeat(np.arange(arr.size), arr)
124
+
125
+
126
+
127
+
128
+
129
+ print(timeit(lambda: method_me(arr), number=2000))
130
+
131
+ print(timeit(lambda: method_hayataka(arr), number=2000))
132
+
133
+ ```
134
+
135
+
136
+
137
+ ```text
138
+
139
+ me 0.5814175409614109
140
+
141
+ hayataka 0.0514739109785296
142
+
143
+ ```
144
+
145
+
146
+
147
+ というわけで10倍近くの差がでました。

2

コードの改善

2019/09/16 04:35

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -44,13 +44,13 @@
44
44
 
45
45
  return np.array(
46
46
 
47
- tuple(itertools.chain(*(
47
+ tuple(itertools.chain.from_iterable(
48
48
 
49
49
  itertools.repeat(index, value)
50
50
 
51
51
  for index, value in enumerate(arr)
52
52
 
53
- ))),
53
+ )),
54
54
 
55
55
  dtype=np.uint8
56
56
 

1

環境を追記

2019/09/16 02:02

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -65,3 +65,11 @@
65
65
 
66
66
 
67
67
  `numpy`の持つ力を活かせてない気がします。何かうまい方法を知っていませんか?
68
+
69
+
70
+
71
+ ### 環境
72
+
73
+
74
+
75
+ Python 3.7.1