numpy slice broadcast的坑, 和ncl或者xarray不同

過去用ncl作array slice習(xí)慣了, 不同的dimension之間就是直接乘起來, 例如

>>> arr = new ((/3, 4, 5/), float)
>>> print(dimsizes(arr((/0, 1/), (/0, 1/), 0)))
(0)     2
(1)     2

即可得到一個(gè)2x2的數(shù)組

結(jié)果今天在用numpy處理數(shù)據(jù)的時(shí)候發(fā)現(xiàn)


import numpy as np

arr = np.arange(60).reshape(3, 4, 5)

arr[[0, 1], [0, 1], 0] # array([0, 25])

arr[[0, 1, 2], [0, 1], 0] # IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

就只能得到2個(gè)數(shù)


一查, 原來是numpy的slice自帶這個(gè)broadcast... 就好像會(huì)把不同dim的index給zip起來再取數(shù)一樣...和ncl實(shí)屬不一樣

想了幾種解決方法

1. 用np.ix_

例如:

arr[np.ix_([0, 1], [0, 1], [0])] # get (2, 2, 1) ndarray

這里[0]是必須的, 所以shape會(huì)變成(2, 2, 1), 也挺煩人, 賦值的話得給右邊的把維度對(duì)應(yīng), 有時(shí)候加一個(gè)1維啥的...例如:

arr[np.ix_([0, 1], [0, 1], [0])] = ncf.variables[var][index1, index2, None]

ncf是netCDF4.Dataset, var是個(gè)二維數(shù)組, 但是得加個(gè)None才能合法賦值

2. 用xarray

import xarray as xr

xrd = xr.DataArray(arr)
xrd[[0, 1], [0, 1], 0]  # get (2, 2) xr.DataArray

這么看xarray還是挺不錯(cuò)的!


參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • numpy & pandas numpy creating arrays The core data struct...
    釗钖閱讀 561評(píng)論 0 1
  • 1 . Data types(數(shù)據(jù)類型) see also: Data type objects Array ty...
    弈宸卜苒閱讀 345評(píng)論 0 1
  • 問題1: 選取二維數(shù)組中的若干行與列的交叉點(diǎn) 例如: 解答見 https://stackoverflow.com/...
    ThomasYoungK閱讀 1,245評(píng)論 0 1
  • 轉(zhuǎn)載自:https://www.raywenderlich.com/5653-create-ml-tutorial...
    珊瑚船閱讀 558評(píng)論 0 3
  • numpy數(shù)組不可以擴(kuò)展 可是它最大的缺點(diǎn)就是不可動(dòng)態(tài)擴(kuò)展——“NumPy的數(shù)組沒有這種動(dòng)態(tài)改變大小的功能,num...
    hzyido閱讀 3,371評(píng)論 0 2

友情鏈接更多精彩內(nèi)容