データベースの時系列を大量に(> 100.000)検索します。一つの時系列が各エントリは8つの値を保持し、5〜10のエントリと2Dのリストである:異なるサイズのサブリストを持つビッグリストをパッディングNumPy配列に効率的に変換
single_time_series = [
[ 43, 1219, 1065, 929, 1233, 2604, 3101, 2196],
[ 70, 1148, 1041, 785, 1344, 2944, 3519, 3506],
[ 80, 1148, 976, 710, 1261, 2822, 3335, 3247],
[ 103, 1236, 1090, 762, 1024, 2975, 3777, 3093],
[ 120, 883, 937, 493, 1221, 4119, 5241, 5133],
[ 143, 1110, 1089, 887, 1420, 2471, 2905, 2845]
] # a time series with 6 entries, each entry represents one day
更なる処理のために、私は1つの3D numpyのアレイに一緒にこれらの個々の時系列の全てが欲しいです。各シリーズの長さは5と10のエントリの間で変動し得るので、しかし、私はパッドにあるすべての時系列を必要とするゼロで埋め-アレイとより短い10:
[
[ 43, 1219, 1065, 929, 1233, 2604, 3101, 2196],
[ 70, 1148, 1041, 785, 1344, 2944, 3519, 3506],
[ 80, 1148, 976, 710, 1261, 2822, 3335, 3247],
[ 103, 1236, 1090, 762, 1024, 2975, 3777, 3093],
[ 120, 883, 937, 493, 1221, 4119, 5241, 5133],
[ 143, 1110, 1089, 887, 1420, 2471, 2905, 2845],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0]
]
現在、私はそれぞれを反復処理することによって、これを達成しています時系列は、データベースから来て、それをパディングし、最終numpyの配列にそれを追加:
MAX_SEQUENCE_LENGTH = 10
all_time_series = ... # retrieved from db
all_padded_time_series = np.array([], dtype=np.int64).reshape(0, MAX_SEQUENCE_LENGTH, 8)
for single_time_series in all_time_series:
single_time_series = np.array(single_time_series, dtype=np.int64)
length_diff = MAX_SEQUENCE_LENGTH - single_time_series.shape[0]
if length_diff > 0:
single_time_series = np.pad(single_time_series, ((0, length_diff), (0,0)), mode='constant')
all_padded_time_series = np.append(all_padded_time_series, [single_time_series], axis=0)
データベース要求は、ほんの数秒で実行している間、パディングと追加の操作は永遠に取る - スクリプトが必要〜45私のiMacの〜100.000時系列の分。
データベースが成長を続けているので、近い将来さらに多くのデータを分析する必要があります。だから私はdbから来るリストをnumpyの配列に変換するより速い方法を探しています。これを行うより効率的な方法があると確信しています。
代わりに 'numpy.concatenate'を試しましたか?私の経験では、 'numpy.pad'はこの種のパディングでは非常に遅いです。 – cberkay
関連性:https://stackoverflow.com/questions/32037893/numpy-fix-array-with-rows-of-different-lengths-by-filling-theempty-elements-wi – cberkay
「np.append」を繰り返した遅すぎる。各配列を3dの '0 '配列にコピーする方がよいでしょう。または@Divakars 2dソリューションを適応させます。あなたはすでに、埋め込まれた配列の形状を知っています。 – hpaulj