亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

屏蔽 Numpy 數組并在不使用 for 循環的情況下對每個掩碼應用計算

屏蔽 Numpy 數組并在不使用 for 循環的情況下對每個掩碼應用計算

哈士奇WWW 2021-11-09 19:55:54
假設我們有以下數據數組:data_array = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3], [4, 4, 4]], np.int16)data_arrayarray([[1, 1, 1],       [1, 1, 2],       [2, 2, 2],       [3, 3, 3],       [4, 4, 4]])我們希望根據以下范圍屏蔽數組,以便能夠對屏蔽部分應用計算:intervals = [[1, 2], [2, 3], [3, 4]]我們首先基于數據數組創建一個空數組和掩碼,以便我們可以組合每個掩碼數組的結果:init = np.zeros((data_array.shape[0], data_array.shape[1]))result_array = np.ma.masked_where((init == 0), init)result_arraymasked_array(data=[[--, --, --],      [--, --, --],      [--, --, --],      [--, --, --],      [--, --, --]],mask=[[ True,  True,  True],      [ True,  True,  True],      [ True,  True,  True],      [ True,  True,  True],      [ True,  True,  True]]有了這個,我們可以啟動一個 for 循環,根據區間范圍屏蔽數組,對屏蔽數組執行計算并將結果組合到單個結果數組中:for inter in intervals:    # Extact the start and en values for interval range    start_inter = inter[0]    end_inter = inter[1]    # Mask the array based on interval range    mask_init = np.ma.masked_where((data_array > end_inter), data_array)    masked_array = np.ma.masked_where((mask_init < start_inter), mask_init)    # Perform a dummy calculation on masked array    outcome = (masked_array + end_inter) * 100    # Combine the outcome arrays    result_array[result_array.mask] = outcome[result_array.mask]結果如下:array([[300.0, 300.0, 300.0],      [300.0, 300.0, 400.0],      [400.0, 400.0, 400.0],      [600.0, 600.0, 600.0],      [800.0, 800.0, 800.0]])我的問題是,如何在不使用 for 循環的情況下實現相同的結果?因此,在單個操作中對整個 data_array 應用屏蔽和計算。請注意,計算的變量隨每個掩碼而變化。是否可以對這個問題應用矢量化方法?我想numpy_indexed可能會有所幫助。謝謝你。
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

如果可以使間隔不重疊,那么您可以使用這樣的函數:


import numpy as np


def func(data_array, intervals):

    data_array = np.asarray(data_array)

    start, end = np.asarray(intervals).T

    data_array_exp = data_array[..., np.newaxis]

    mask = (data_array_exp >= start) & (data_array_exp <= end)

    return np.sum((data_array_exp + end) * mask * 100, axis=-1)

在這種情況下,結果應該與原始代碼相同:


import numpy as np


def func_orig(data_array, intervals):

    init = np.zeros((data_array.shape[0], data_array.shape[1]))

    result_array = np.ma.masked_where((init == 0), init)

    for inter in intervals:

        start_inter = inter[0]

        end_inter = inter[1]

        mask_init = np.ma.masked_where((data_array > end_inter), data_array)

        masked_array = np.ma.masked_where((mask_init < start_inter), mask_init)

        outcome = (masked_array + end_inter) * 100

        result_array[result_array.mask] = outcome[result_array.mask]

    return result_array.data


data_array = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3], [4, 4, 4]], np.int16)

intervals = [[1, 1.9], [2, 2.9], [3, 4]]

print(np.allclose(func(data_array, intervals), func_orig(data_array, intervals)))

# True


查看完整回答
反對 回復 2021-11-09
  • 1 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號