小编Val*_*Val的帖子

R(windows)中大栅格的并行处理

我正在使用doSNOW包,更具体地说是parLapply函数,用于在大栅格数据集列表(OS:Windows x64)上执行重新分类(以及随后的其他操作).

代码看起来有点像这个简约的例子:

library(raster)
library(doSNOW)

#create list containing test rasters

x <- raster(ncol=10980,nrow=10980) 
x <- setValues(x,1:ncell(x)) 

list.x <- replicate( 9 , x )

#setting up cluster

NumberOfCluster <- 8
cl <- makeCluster(NumberOfCluster)
registerDoSNOW(cl)
junk <- clusterEvalQ(cl,library(raster))

#perform calculations on each raster

list.x <- parLapply(cl,list.x,function(x) calc(x,function(x) { x * 10 }))

#stop cluster

stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

代码实际上按预期工作.当我想继续结果时会出现问题.我收到此错误消息:

> plot(list.x[[1]])
Error in file(fn, "rb") : cannot open the connection
In addition: Warning message:
In file(fn, "rb") :
  cannot open file 'C:\Users\*****\AppData\Local\Temp\RtmpyKYdpY\raster\r_tmp_2016-02-29_133158_752_67867.gri': No such file …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r raster mclapply snow

8
推荐指数
1
解决办法
1912
查看次数

用R将栅格转换为矩阵

我目前正在将原始矩阵转换为光栅以使用焦点功能,然后我想将光栅转换回矩阵.但是当我尝试使用栅格函数as.matrix()时,我有一条错误消息.即使有这个非常简单的例子:

r <- raster(ncol=3, nrow=3)
r[] <- 1:ncell(r)
as.matrix(r)
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

数组中的错误(x,c(length(x),1L),if(!is.null(names(x)))list(names(x),):

'dimnames'[1]的长度不等于数组范围

我使用RSTUDIO,R版本3.4.0和ncdf4,rasterrgdallibrairies.

谢谢您的帮助.

r raster r-raster

6
推荐指数
1
解决办法
5229
查看次数

pip install 无法安装依赖项

TL;DR即使我已经使用install_requiresin指定了依赖项setup.py,但安装还是pip失败,因为找不到某些依赖项。


我开发了一个软件包,打算通过PyPi. 我创建了一个内置的分发轮并将其上传到,testPyPI以查看上传是否一切正常以及是否可以从用户角度安装该包。

但是,当我尝试pip在普通 python 2.7 环境中安装该包时,安装过程在安装依赖项时失败。

我的包依赖于这些包(我setup.py相应地将其添加到文件中):

...

install_requires=['numpy','gdal','h5py','beautifulsoup4','requests','tables','progress'],

...
Run Code Online (Sandbox Code Playgroud)

因此,当我运行 pip install 时,一切看起来都正常,直到收到此错误:

找不到满足进度要求的版本(来自#NAME#)(来自版本:)找不到进度的匹配发行版(来自#NAME#)

当我删除进度依赖项时(没有它我也可以生活),同样的事情也会发生pytables

找不到满足要求的版本表(来自#NAME#)(来自版本:)找不到表的匹配分布(来自#NAME#)

如果我事先手动运行pip install tablespip install progress一切都会按预期进行。

那么,我如何确保如果有人下载我的软件包,所有缺少的依赖项都会随之安装?

相关奖金问题

MANIFEST.in如果模块不可用,我可以在包中包含一个wheel文件(也许通过)并将其安装为依赖项吗?如果是这样,怎么办?

python pip setup.py python-packaging

6
推荐指数
1
解决办法
1万
查看次数

在 pydantic 模型中使用正则表达式来处理字符串集

我正在使用 pydantic 模型来表示fastapi.

from pydantic import BaseModel, Schema

class Files(BaseModel):
    '''Class for file URLs'''
    urls: Set[str] = Schema(..., title='Urls to files')
Run Code Online (Sandbox Code Playgroud)

这会将请求正文限制为定义为 的 url 集str

我想知道是否有一种方法可以通过使用例如正则表达式来进一步限制正文中发送的网址的“类型”。我知道Schema有一个regex标志,但我认为这只适用于单个输入(或者至少它不适用于我的列表)。

python pydantic

6
推荐指数
1
解决办法
2万
查看次数

通过 3-D xarray.Dataset 绘制切片

我想通过 3-D xarray.Dataset 绘制一个切片,如下所示:

3-D netcdf 坐标的可视化

我们想要绘制的二维切片

这就是我开始的方式(为简单起见,使用教程air_temperature数据集)

# import packages
import xarray as xr
import numpy as np

# load dataset
ds = xr.tutorial.open_dataset("air_temperature")

# get slice values
tgt_lon = xr.DataArray(np.linspace(220, 280, num=15), dims="lon")
tgt_lat = xr.DataArray(np.linspace(30, 50, num=15), dims="lat")

# crop to region of interest - this works fine
da = ds.sel(lon=tgt_lon, 
            lat=tgt_lat, 
            method="nearest")
Run Code Online (Sandbox Code Playgroud)

现在我们仍然有一个 3-D xarray.Dataset。对于二维绘图,我们希望将经度和纬度堆叠到相对于零点的距离数组(此处:角点 x0/y0,如图所示)。

# zero point: lat_min/lon_min
lon_orig = da.lon.min().values
lat_orig = da.lat.min().values

# stack longitude and latitude -- gives tuple for dist
sta …
Run Code Online (Sandbox Code Playgroud)

arrays numpy python-xarray

6
推荐指数
1
解决办法
726
查看次数

python:使用gdal绑定在内存中执行gdalwarp

我现在有一个处理链中R,这将下载数据MODIS,然后调用gdalwarp从系统重新投影的特定子数据集(例如NDVI)成WGS1984.GeoTiffs然后将结果收集到HDF5文件中以供进一步处理.

现在我移动处理链python,我想知道是否有跳过写入的步骤的方式GeoTiffs与的功能到磁盘gdal模块.

需要说明的是,问题是:

我可以执行gdalwarp严格使用gdal模块的python绑定而无需写入磁盘吗?

我一直在研究,最接近我的问题的答案是这些帖子:

第一种方法需要一个模板,所以不是我想要的.

第二种方法看起来更有前途,它使用的功能AutoCreateWarpedVRT似乎是我想要的.虽然,与答案中的示例相反,我的结果与引用不匹配(独立于任何错误阈值).

在我之前gdalwarp直接调用的实现中,除目标参考系统外,我还指定了目标分辨率.所以我认为这可能会有所不同 - 但我无法在python中的gdal绑定中设置它.

这是我尝试过的(抱歉,没有MODIS数据就无法重现):

import gdal
import osr

ds = gdal.Open('/data/MOD13A2.A2016305.h18v07.005.2016322013359.hdf')

t_srs = osr.SpatialReference()
t_srs.ImportFromEPSG(4326)

src_ds = gdal.Open(ds.GetSubDatasets()[0][0], gdal.GA_ReadOnly)

dst_wkt =t_srs.ExportToWkt()
error_threshold = 0.125
resampling=gdal.GRA_NearestNeighbour

tmp_ds = gdal.AutoCreateWarpedVRT( src_ds,
                                  None, # src_wkt : left to default value --> will use the one from source
                                   dst_wkt,
                                   resampling,
                                   error_threshold) …
Run Code Online (Sandbox Code Playgroud)

python gis gdal

5
推荐指数
1
解决办法
4829
查看次数

python click 中的选项的多种输入类型(“要么/或”)

是否可以为 a 指定两种输入类型click.option,所提供的值必须位于其中一种类型?

在带有输入的普通 python 函数中,我会像这样声明它:

from typing import Union

def fun(x: Union[int, str]):
    if isinstance(x, str):
        x = int(x)
    return x**2
Run Code Online (Sandbox Code Playgroud)

所以x应该是intor str

我想click实现同样的目标,只是当输入类型不在定义的类型中时脚本会失败。

我试过了

@click.option('-x', type=(click.INT, click.STRING))
Run Code Online (Sandbox Code Playgroud)

但这似乎只适用于有多个参数的场合。

python python-3.x python-click

5
推荐指数
0
解决办法
1283
查看次数

如何创建使用不等间距矩阵图覆盖点数据的图?

我想创建一个类似于附加图像的绘图,其中点数据放在矩阵颜色图上:

Excel图表在彩色单元格上叠加点图表

我有xy数据.我有那么创建的矩阵xy_bincount通过计算点数xy我的XY斌组合内的谎言.箱宽度不均匀,如附图所示.

在R,Matlab或Python中创建这个图表会更容易吗?

谢谢您的帮助!

x<-c(2.56481, 2.11009, 1.72927, 1.47803, 1.74279, 3.29555, 3.66061, 2.63349, 2.43808, 2.13, 3.09267, 2.3555, 2.48811, 4.05344, 3.38401, 2.69907, 2.26378, 2.71978)
y<-c(-1.26044, 13.6098, 0.710325, -4.27657, 11.1908, -7.2431, -3.19167, 20.7423, 10.009, 32.12, 42.6192, 13.9598, -0.412724, -20.3846, -6.97259, -14.2046, 8.30859, 0.0386572)
xylabels<-c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R")

xy_bincount<-matrix(c(0, 0, 0, 6, 0, 0, 6, 12, 0, 0, 24, 6, 0, 0, 29, 0, 0, 0, 12, 6),nrow = 5, ncol = 4, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)

visualization r ggplot2

4
推荐指数
1
解决办法
101
查看次数

安装适用于 Python 3.7.3 的 GDAL 的问题

我在尝试在 python 3.7.3 中安装 GDAL 时遇到问题。有没有人有安装这个的经验?另外,这是我第一次在这里问。请帮助或指导我找到任何可以就此提供建议的人吗?提前致谢。

pip install GDAL
    Collecting GDAL
      Using cached https://files.pythonhosted.org/packages/ae/09/cac5021db34f5c95c6a660b90e5d27062a520fe32a0493f68d07a7055d30/GDAL-3.0.4.tar.gz
    Building wheels for collected packages: GDAL
      Building wheel for GDAL (setup.py) ... error
      ERROR: Complete output from command 'C:\Users\Farhan\Anaconda3\python.exe' -u -c 'import setuptools, tokenize;__file__='"'"'C:\\Users\\Farhan\\AppData\\Local\\Temp\\pip-install-bwqvn3wb\\GDAL\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d 'C:\Users\Farhan\AppData\Local\Temp\pip-wheel-0gdpm9_l' --python-tag cp37:
      ERROR: running bdist_wheel

        error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
        ----------------------------------------
    ERROR: Command "'C:\Users\Farhan\Anaconda3\python.exe' -u -c 'import setuptools, tokenize;__file__='"'"'C:\\Users\\Farhan\\AppData\\Local\\Temp\\pip-install-bwqvn3wb\\GDAL\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, …
Run Code Online (Sandbox Code Playgroud)

gdal python-3.x

4
推荐指数
1
解决办法
1万
查看次数

xarray 计算多年 netcdf 的月平均值

我有一个来自 ERA5 的 2m 温度 netcdf 文件,该文件从 2000 年到 2019 年的 04 到 10 个月,总共提供 13680 个时间步长和 61x161 经纬度维度。我想分别计算每年所有每日时间步长的月平均值。例如,我们将获得 2000 年 4 月、2000 年 5 月等数据的月平均值。我已尝试使用 xarray resample 使用以下代码,但出现两个问题。

\n
    \n
  1. 出于某种原因,平均值似乎多年来都是平均值。
  2. \n
  3. 重采样函数创建月份 01、02、03、11 和 12,尽管没有数据!
  4. \n
\n

这是我\xe2\x80\x99m 谈论的内容:

\n
import xarray as xr\nds = xr.open_dataset(netcdf)\nmonthly_data=ds.resample(time='1M').mean()\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以查看显示每月时间步长的时间戳,包括不相关的月份。

\n
print(np.array(monthly_data.time))\narray(['2000-04-30T00:00:00.000000000', '2000-05-31T00:00:00.000000000',\n       '2000-06-30T00:00:00.000000000', '2000-07-31T00:00:00.000000000',\n       '2000-08-31T00:00:00.000000000', '2000-09-30T00:00:00.000000000',\n       '2000-10-31T00:00:00.000000000', '2000-11-30T00:00:00.000000000',\n       '2000-12-31T00:00:00.000000000', '2001-01-31T00:00:00.000000000',\n
Run Code Online (Sandbox Code Playgroud)\n

为了验证温度的内容,我将数据转换为数据帧。

\n
temp_ar = np.array(monthly_data.t2m)    \nprint(pd.DataFrame(temp_ar[0,:,:]).head())\n          0           1           2    ...         158         159         160\n0  270.940613  270.911652  270.926727  ...         NaN …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-xarray

4
推荐指数
1
解决办法
1888
查看次数

嵌套上下文管理器中的模拟 requests.Session.get

我想模拟一个函数requests.Session,该函数使用在上下文管理器中创建的对象来执行请求get,再次使用上下文管理器。所以涉及到两个上下文管理器。

这是一个示例代码:

# main.py

from requests import Session

def fun(session):
    with session.get("https://httpstat.us/200") as response:
        print(response)

        
def run():
    with Session() as session:
        fun(session)

        
if __name__ == "__main__":
    run()

Run Code Online (Sandbox Code Playgroud)

200执行时,会按预期打印的状态代码。

现在我想模拟 get 请求,以返回不同的值。不知怎的,我无法浏览混乱的上下文管理器和返回值。

这是我最大的努力:

# maintest.py
from unittest.mock import patch
from main import run

def test_main():
    
    with patch("main.Session") as mocked_session:
        mocked_session.__enter__.return_value.get.__enter__.return_value = "MOCKED"
        run()
Run Code Online (Sandbox Code Playgroud)

使用 pytest 运行测试,我希望得到"MOCKED"打印,但我得到了

<MagicMock name='Session().__enter__().get().__enter__()' id='140303100714240'>

__enter__我尝试过任何.get可以想象的组合.return_value

python mocking python-requests python-unittest

4
推荐指数
1
解决办法
1930
查看次数

在 Google Earth Engine 中将图像结果剪辑为 ROI

我在 Google Earth Engine 中为感兴趣的特定区域开发了海面温度的时间序列。运行下面的代码显示整个数据集的海面温度

Map.addLayer(BIOT)

// Load an image.
var sst = ee.ImageCollection('NASA/OCEANDATA/MODIS-Aqua/L3SMI').select('sst')
  .filterDate('2013-01-01', '2018-01-01')
  .filterBounds(BIOT);

print('sst', sst)

var TS1 = Chart.image.series(sst, BIOT,  ee.Reducer.mean(),
1000, 'system:time_start').setOptions({title: 'BIOT SST',vAxis: {title: 'SST 
Celsius'},
});
print(TS1);

Map.setCenter(72.25, -6.8, 7); //lat, long, zoom
Map.addLayer (sst, {'min': 23, 'max': 34, 'palette':"0000ff,32cd32,ffff00,ff8c00,ff0000"});
Run Code Online (Sandbox Code Playgroud)

我尝试添加代码:

Map.addLayer(sst.clip(BIOT))
Run Code Online (Sandbox Code Playgroud)

要将数据剪辑到我已经定义的区域 ( BIOT),但图像仍显示所有区域的所有数据,而不是我指定的数据。有任何想法吗?任何帮助表示赞赏!

mapping clip google-earth-engine

3
推荐指数
1
解决办法
9361
查看次数