以下の様なnumpy.ndarray
から
python
1arr = np.array([1, 0, 3, ], dtype=np.uint8)
以下の様なnumpy.ndarray
を作ろうとしています。
python
1# arr[0]の値が1でarr[2]の値が3なので、0が1つ 2が3つ。要素の順番は問わない。 2[0 2 2 2]
以下のような物は自分で作れはしましたが
import numpy as np import itertools arr = np.array([1, 0, 3, ], dtype=np.uint8) def convert(arr): return np.array( tuple(itertools.chain.from_iterable( itertools.repeat(index, value) for index, value in enumerate(arr) )), dtype=np.uint8 ) print(convert(arr))
numpy
の持つ力を活かせてない気がします。何かうまい方法を知っていませんか?
環境
Python 3.7.1
追記
hayataka2049さんに教えてもらった方法と私が考えた方法の実行速度を比べた結果を載せておきます。
python
1import numpy as np 2import itertools 3from timeit import timeit 4 5arr = np.random.randint(3, size=100, dtype='uint8') # 実際に想定しているdata量 6 7 8def method_me(arr): 9 return np.array( 10 tuple(itertools.chain.from_iterable( 11 itertools.repeat(index, value) 12 for index, value in enumerate(arr) 13 )), 14 dtype=np.uint8 15 ) 16 17def method_hayataka(arr): 18 return np.repeat(np.arange(arr.size), arr) 19 20 21print(timeit(lambda: method_me(arr), number=2000)) 22print(timeit(lambda: method_hayataka(arr), number=2000))
text
1me 0.5814175409614109 2hayataka 0.0514739109785296
というわけで10倍近くの差がでました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/16 04:27