細々と

Transform 2D array to a 3D array with overlapping strides – StackOverflow

「numpy.lib.stride_tricks.as_strided」は強力だけど,使わなくて良いなら極力使わない方が良い.
(関連:頭の体操

import numpy as np

a = np.array([[1,2,3],
 [4,5,6],
 [7,8,9],
 [10,11,12],
 [13,14,15]])

a[np.arange(2, -1, -1) + np.arange(3)[:, np.newaxis]]

array([[[ 7, 8, 9],
[ 4, 5, 6],
[ 1, 2, 3]],

   [[10, 11, 12],
    [ 7,  8,  9],
    [ 4,  5,  6]],

   [[13, 14, 15],
    [10, 11, 12],
    [ 7,  8,  9]]])

How to make an index combining values of lists nested in tuples? – StackOverflow

これも,以前の話と同様.
(関連:頭の体操

from collections import defaultdict


my_list = [('a',[0]), ('b',[1]), ('c',[2]), ('a',[3])]
dd = defaultdict(list)
for k, v in my_list:
    dd[k].append(v[0])

defaultdict(list, {‘a’: [0, 3], ‘b’: [1], ‘c’: [2]})

辞書でやろうとすると効率がかなり悪い.

my_dict = {x: [v[0] for k, v in my_list if k == x] for x in set(tuple(zip(*my_list))[0])}

{‘a’: [0, 3], ‘b’: [1], ‘c’: [2]}

同様に,

Convert python list into dictionary and adding values having same keys – StackOverflow

datalist = [[868, 'S00086', 640.80, 38.45], [869, 'S00087', 332.31, 19.94], [869, 'S00087', 144.00, 8.64],]
dd = defaultdict(list)
for elm in datalist:
    dd[elm[0]].append(elm[1:])
for k, v in dd.items():
    if len(dd[k]) > 1:
        dd[k] = [v[0][0]] + [sum(x) for x in list(zip(*(v)))[1:]]

defaultdict(list,
{868: [[‘S00086’, 640.8, 38.45]],
869: [‘S00087’, 476.31, 28.580000000000002]})
 
 
 

%%timeit
datalist = [[868, 'S00086', 640.80, 38.45], [869, 'S00087', 332.31, 19.94], [869, 'S00087', 144.00, 8.64],]
datadict = {}
for k, group in groupby(sorted(datalist), key=lambda x: x[0]):
    for v in group:
        if k not in datadict:
            datadict[k] = v[1:]
        else:
            datadict[k][1] += v[2]
            datadict[k][2] += v[3]

5.92 µs ± 98.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
datalist = [[868, 'S00086', 640.80, 38.45], [869, 'S00087', 332.31, 19.94], [869, 'S00087', 144.00, 8.64],]
dd = defaultdict(list)
for elm in datalist:
    dd[elm[0]].append(elm[1:])
for k, v in dd.items():
    if len(dd[k]) > 1:
        dd[k] = [v[0][0]] + [sum(x) for x in list(zip(*(v)))[1:]]

7.59 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

データ数がちょっと増えれば(len(datalist) > 30程度),groupbyよりもordereddictの方が速い.len(datalist) ~ 200になると,倍位変わってくる.

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中