【问题标题】:slice in xarray gives error 'float' object cannot be interpreted as an integerxarray 中的切片给出错误“浮点”对象不能解释为整数
【发布时间】:2020-09-26 20:21:24
【问题描述】:

我正在尝试使用xarray 以经度为单位发送slice 数据。 数据位于我根据我所做的测量创建的 netcdf 文件中。

xarray.Dataset 具有以下属性:

尺寸:​​m>

(纬度:1321,经度:1321)

数据变量:

  1. (lon) float64 '8.413 8.411 8.409 ... 4.904 4.905'
  2. (lat) float64 '47.4 47.4 47.41 ... 52.37 52.37'
  3. (数据)float64 ... #dimension: 1321

我的代码是:

import xarray as xr
obs = xr.open_dataset('data.nc')
obs=obs['data'].sel(lon=slice(4.905, 8.413))

我得到的错误是TypeError: 'float' object cannot be interpreted as an integer

我无法确定这是我的代码中的错误,还是 xarray 中的错误。我希望使用isel 而不是sel 会出现这样的错误。在这里或the xarray documentation.@

上找不到任何解决方案

完整的错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-434-5b37e4c5d0c6> in <module>
----> 1 obs=obs['data'].sel(lon=slice(4.905, 8.413))

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataarray.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   1059             method=method,
   1060             tolerance=tolerance,
-> 1061             **indexers_kwargs,
   1062         )
   1063         return self._from_temp_dataset(ds)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   2066             self, indexers=indexers, method=method, tolerance=tolerance
   2067         )
-> 2068         result = self.isel(indexers=pos_indexers, drop=drop)
   2069         return result._overwrite_indexes(new_indexes)
   2070 

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py in isel(self, indexers, drop, **indexers_kwargs)
   1933             var_indexers = {k: v for k, v in indexers.items() if k in var_value.dims}
   1934             if var_indexers:
-> 1935                 var_value = var_value.isel(var_indexers)
   1936                 if drop and var_value.ndim == 0 and var_name in coord_names:
   1937                     coord_names.remove(var_name)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in isel(self, indexers, **indexers_kwargs)
   1058 
   1059         key = tuple(indexers.get(dim, slice(None)) for dim in self.dims)
-> 1060         return self[key]
   1061 
   1062     def squeeze(self, dim=None):

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in __getitem__(self, key)
    701         array `x.values` directly.
    702         """
--> 703         dims, indexer, new_order = self._broadcast_indexes(key)
    704         data = as_indexable(self._data)[indexer]
    705         if new_order:

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in _broadcast_indexes(self, key)
    540 
    541         if all(isinstance(k, BASIC_INDEXING_TYPES) for k in key):
--> 542             return self._broadcast_indexes_basic(key)
    543 
    544         self._validate_indexers(key)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in _broadcast_indexes_basic(self, key)
    568             dim for k, dim in zip(key, self.dims) if not isinstance(k, integer_types)
    569         )
--> 570         return dims, BasicIndexer(key), None
    571 
    572     def _validate_indexers(self, key):

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in __init__(self, key)
    369                 k = int(k)
    370             elif isinstance(k, slice):
--> 371                 k = as_integer_slice(k)
    372             else:
    373                 raise TypeError(

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in as_integer_slice(value)
    344 
    345 def as_integer_slice(value):
--> 346     start = as_integer_or_none(value.start)
    347     stop = as_integer_or_none(value.stop)
    348     step = as_integer_or_none(value.step)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in as_integer_or_none(value)
    340 
    341 def as_integer_or_none(value):
--> 342     return None if value is None else operator.index(value)
    343 
    344 

我想选择整个数据,因为最终我想从具有更宽网格的更大数据库中减去整个数组。这个更大的数据库也是一个 NETCDF 文件。对于那个,我设法用我在这个较小的数据集上尝试的完全相同的代码来分割经度,我得到了错误。唯一的区别是,更大的 NETCDF 使用 float32 格式。我不怀疑这会导致错误。

感谢任何帮助。谢谢。

【问题讨论】:

  • 你能展示你的数据集的完整repr吗? (print(obs) 应该这样做)。

标签: python-3.x numpy slice netcdf python-xarray


【解决方案1】:

我想我找到了问题所在。 当我为观察创建 netcdf 文件时,我在命名 lon 和 lat 数据时在createDimension 部分犯了一个错误。因此,lat 和 lon 出现在 netcdf 文件的“数据变量”下,它们应该出现在“坐标”下

错误是这样的:

#Specifying dimensions#
f.createDimension('longitude', len(lon_list))
f.createDimension('latitude', len(lat_list))
#Building variables
longitude = f.createVariable('lon', float, ('lon',), zlib=True)
latitude = f.createVariable('lat', float, ('lat',), zlib=True)  

data = f.createVariable('data', float, ('lat','lon'), zlib=True)

正确的是:

#Specifying dimensions#
f.createDimension('lon', len(lon_list))
f.createDimension('lat', len(lat_list))
#Building variables
longitude = f.createVariable('lon', float, ('lon',), zlib=True)
latitude = f.createVariable('lat', float, ('lat',), zlib=True)  

data = f.createVariable('data', float, ('lat','lon'), zlib=True)

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 2021-12-05
    • 2021-12-26
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多