numpy.add.at

Numpy Advanced Indexing: same index used multiple times in += [duplicate] – StackOverflow

Performs unbuffered in place operation on operand a for elements specified by indices. For addition ufunc, this method is equivalent to a[indices] += b, except that results are accumulated for elements that are indexed more than once.

ふーん.

import numpy as np

a = np.ones(8)
pos = np.array([1, 3, 5, 3])
a

array([ 1., 1., 1., 1., 1., 1., 1., 1.])

np.add.at(a, pos, 1)

a

array([ 1., 2., 1., 3., 1., 2., 1., 1.])

a[pos] = a[pos] + 1
a

array([ 1., 2., 1., 2., 1., 2., 1., 1.])

(ind, cnt) = np.unique(pos, return_counts=True)
a[ind] += cnt
a

array([ 1., 2., 1., 3., 1., 2., 1., 1.])

%%timeit
a = np.ones(8)
pos = np.array([1, 3, 5, 3])
np.add.at(a, pos, 1)

27.2 µs ± 4.65 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
a = np.ones(8)
pos = np.array([1, 3, 5, 3])
(ind, cnt) = np.unique(pos, return_counts=True)
a[ind] += cnt

71.4 µs ± 9.45 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
N = 100
a = np.ones(N)
pos = np.random.randint(0, N, size=N)
np.add.at(a, pos, 1)

45.9 µs ± 4.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
N = 100
a = np.ones(N)
pos = np.random.randint(0, N, size=N)
(ind, cnt) = np.unique(pos, return_counts=True)
a[ind] += cnt

85 µs ± 3.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
N = 1000
a = np.ones(N)
pos = np.random.randint(0, N, size=N)
np.add.at(a, pos, 1)

246 µs ± 38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
N = 1000
a = np.ones(N)
pos = np.random.randint(0, N, size=N)
(ind, cnt) = np.unique(pos, return_counts=True)
a[ind] += cnt

201 µs ± 31.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中