第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對數(shù)組中的每個元素 n 快速執(zhí)行 n 次函數(shù)

對數(shù)組中的每個元素 n 快速執(zhí)行 n 次函數(shù)

www說 2023-04-18 14:27:16
我有一個 n_years by n_repeats 計數(shù)數(shù)據(jù)數(shù)組。對于每個元素 ( e ),我想從損失嚴(yán)重性數(shù)組中抽取e次并取抽取的總和。以下是迄今為止我能做的最好的。它幾乎不比forpython 中的兩個嵌套循環(huán)快。在我的實(shí)際用例中,我的數(shù)組是 100,000 x 1,000。有誰知道如何使用純 numpy 完成此操作?frequency = np.array(    [        [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, 1],        [1, 2, 1],        [1, 2, 1],        [2, 4, 2],        [2, 4, 2],        [3, 5, 2],    ])sev = np.array([1,1,2,2,1,2,3,4,5,1,1,2])def calculate_insured_losses(frequency, severity_array):    def yearly_loss(element, severity_array=severity_array):          return 0 if element == 0 else np.random.choice(severity_array, size=element, replace=True).sum()    return np.vectorize(yearly_loss)(frequency.flatten()).reshape(frequency.shape)calculate_insured_losses(freq, sev)每個循環(huán) 291 μs ± 10.6 μs(7 次運(yùn)行的平均值 ± 標(biāo)準(zhǔn)偏差,每次 1000 次循環(huán))編輯:帶有嵌套循環(huán)的更簡單的代碼def calculate_insured_losses(frequency, severity):        def yearly_loss(element, severity_array=severity):        if element == 0:            return 0        else:            return np.random.choice(severity_array, size=element, replace=True).sum()        n_years, n_repeats = frequency.shape        losses = np.empty(shape=frequency.shape)        for year in range(n_years):        for repeat in range(n_repeats):            losses[year, repeat] = yearly_loss(frequency[year, repeat])    return lossescalculate_insured_losses(freq, sev)
查看完整描述

1 回答

?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個贊

你可以像這樣更快地做到這一點(diǎn):


import numpy as np


def calculate_insured_losses(frequency, severity_array):

    # Flattened frequencies table

    r = frequency.ravel()

    # Accumulate

    rcum = np.cumsum(r)

    # Take all ramdom samples at once

    c = np.random.choice(severity_array, rcum[-1], replace=True)

    # Sum segments

    res = np.add.reduceat(c, rcum - r)

    # Make zero elements

    res *= r.astype(bool)

    # Return reshaped result

    return res.reshape(frequency.shape)


# For comparison

def calculate_insured_losses_loop(frequency, severity_array):

    def yearly_loss(element, severity_array=severity_array):  

        return 0 if element == 0 else np.random.choice(severity_array, size=element, replace=True).sum()

    return np.vectorize(yearly_loss)(frequency.flatten()).reshape(frequency.shape)


# Test

frequency = np.array(

    [

        [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, 1],

        [1, 2, 1],

        [1, 2, 1],

        [2, 4, 2],

        [2, 4, 2],

        [3, 5, 2],

    ]

)

sev = np.array([1, 1, 2, 2, 1, 2, 3, 4, 5, 1, 1, 2])

# Check results from functions match

np.random.seed(0)

res = calculate_insured_losses(frequency, sev)

np.random.seed(0)

res_loop = calculate_insured_losses_loop(frequency, sev)

print(np.all(res == res_loop))

# True


# Benchmark

%timeit calculate_insured_losses(frequency, sev)

# 32.4 μs ± 220 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit calculate_insured_losses_loop(frequency, sev)

# 383 μs ± 11.6 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


查看完整回答
反對 回復(fù) 2023-04-18
  • 1 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號