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

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

將 scipy.ndimage.convolve 應用于三維 xarray DataArray

將 scipy.ndimage.convolve 應用于三維 xarray DataArray

慕哥9229398 2021-06-24 05:11:43
我有一個xarray尺寸為 x、y、z的 3D DataArray,我試圖scipy.ndimage.convolve在每個 xy 平面上應用,同時將輸出保持為 DataArray。當然,我正試圖用它xr.apply_ufunc來做到這一點。如果我只為一架飛機這樣做,它就可以完美運行:da=xr.DataArray(np.random.rand(5,5,5), dims=("x", "y", "z"))kernel=np.ones((3,3))from scipy.ndimage import convolveconv1 = lambda x: convolve(x, kernel, mode="wrap")print(xr.apply_ufunc(conv1, da[:,:,0])) # works successfully我現在試圖想出一種方法來為每個 xy 平面做同樣的事情。我認為會起作用的是使用np.apply_along_axisor np.apply_over_axes,但它們都不起作用。我可以遍歷軸,將所有內容都放在一個列表中,然后進行連接,但我試圖使用它xr.apply_ufunc來避免屬性出現問題。有沒有辦法做到這一點?這是我認為應該工作的示例,但事實并非如此:np.apply_over_axes(conv1, c, axes=(0,1))但這失敗了TypeError: <lambda>() takes 1 positional argument but 2 were given
查看完整描述

2 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

使用形狀為 (3, 3, 1) 的內核代替 (3, 3) 怎么樣?


kernel2d = np.ones((3, 3))

conv2d = lambda x: convolve(x, kernel2d, mode="wrap")

result2d = xr.apply_ufunc(conv2d, da[:, :, 0])


kernel3d = np.ones((3, 3, 1))

conv3d = lambda x: convolve(x, kernel3d, mode="wrap")

result3d = xr.apply_ufunc(conv3d, da)


(result2d == result3d[:, :, 0]).all()  # -> True

另一種選擇是在 中使用矢量化邏輯xr.apply_ufunc,這可能更接近您嘗試執行的操作


kernel = np.ones((3, 3))

conv = lambda x: convolve(x, kernel, mode="wrap")

result = xr.apply_ufunc(conv, da, input_core_dims=[['x', 'y']], 

                        output_core_dims=[['x', 'y']],

                        vectorize=True)

(result2d == result.transpose('x', 'y', 'z')).all()  # --> True

此選項只是為了方便而準備的,因此它可能比計算矢量化的第一個要慢得多。


查看完整回答
反對 回復 2021-06-29
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

我想出的一個可能的答案是手動執行此操作:


def conv_rx(da, axis="z"):

    planes = [ xr.apply_ufunc(conv1, da.sel(z=z)) for z in da.z ]

    new = xr.concat(planes, dim=axis)

    return new.transpose(*da.dims)

這會產生正確的結果。但是,我對此不太滿意,因為它不優雅而且速度很慢。


查看完整回答
反對 回復 2021-06-29
  • 2 回答
  • 0 關注
  • 461 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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