- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我正在尝试实现一个已经描述过的解决方案 here ,但我正在稍微改变一下。我不是仅仅尝试通过操作更改数组,而是尝试使用 xarray 从 NetCDF 文件中读取,然后使用多处理模块写入共享的 numpy 数组。
我觉得我已经很接近了,但是出了点问题。我在下面粘贴了一个可复制的、简单的复制/粘贴示例。如您所见,当我运行进程时,它们都可以读取我创建的文件,但它们没有正确更新我尝试写入的共享 numpy 数组。任何帮助将不胜感激。
代码
import ctypes
import logging
import multiprocessing as mp
import xarray as xr
from contextlib import closing
import numpy as np
info = mp.get_logger().info
def main():
data = np.arange(10)
for i in range(4):
ds = xr.Dataset({'x': data})
ds.to_netcdf('test_{}.nc'.format(i))
ds.close()
logger = mp.log_to_stderr()
logger.setLevel(logging.INFO)
# create shared array
N, M = 4, 10
shared_arr = mp.Array(ctypes.c_float, N * M)
arr = tonumpyarray(shared_arr, dtype=np.float32)
arr = arr.reshape((N, M))
# Fill with random values
arr[:, :] = np.zeros((N, M))
arr_orig = arr.copy()
files = ['test_0.nc', 'test_1.nc', 'test_2.nc', 'test_3.nc']
parameter_tuples = [
(files[0], 0),
(files[1], 1),
(files[2], 2),
(files[3], 3)
]
# write to arr from different processes
with closing(mp.Pool(initializer=init, initargs=(shared_arr,))) as p:
# many processes access different slices of the same array
p.map_async(g, parameter_tuples)
p.join()
print(arr_orig)
print(tonumpyarray(shared_arr, np.float32).reshape(N, M))
def init(shared_arr_):
global shared_arr
shared_arr = shared_arr_ # must be inherited, not passed as an argument
def tonumpyarray(mp_arr, dtype=np.float64):
return np.frombuffer(mp_arr.get_obj(), dtype)
def g(params):
"""no synchronization."""
print("Current File Name: ", params[0])
tmp_dataset = xr.open_dataset(params[0])
print(tmp_dataset["x"].data[:])
arr = tonumpyarray(shared_arr)
arr[params[1], :] = tmp_dataset["x"].data[:]
tmp_dataset.close()
if __name__ == '__main__':
mp.freeze_support()
main()
最佳答案
1.你忘记在 tonumpyarray
之后重新整形。
2.你在tonumpyarray
中使用了错误的dtype
。
import ctypes
import logging
import multiprocessing as mp
import xarray as xr
from contextlib import closing
import numpy as np
info = mp.get_logger().info
def main():
data = np.arange(10)
for i in range(4):
ds = xr.Dataset({'x': data})
ds.to_netcdf('test_{}.nc'.format(i))
ds.close()
logger = mp.log_to_stderr()
logger.setLevel(logging.INFO)
# create shared array
N, M = 4, 10
shared_arr = mp.Array(ctypes.c_float, N * M)
arr = tonumpyarray(shared_arr, dtype=np.float32)
arr = arr.reshape((N, M))
# Fill with random values
arr[:, :] = np.zeros((N, M))
arr_orig = arr.copy()
files = ['test_0.nc', 'test_1.nc', 'test_2.nc', 'test_3.nc']
parameter_tuples = [
(files[0], 0),
(files[1], 1),
(files[2], 2),
(files[3], 3)
]
# write to arr from different processes
with closing(mp.Pool(initializer=init, initargs=(shared_arr, N, M))) as p:
# many processes access different slices of the same array
p.map_async(g, parameter_tuples)
p.join()
print(arr_orig)
print(tonumpyarray(shared_arr, np.float32).reshape(N, M))
def init(shared_arr_, N_, M_): # add shape
global shared_arr
global N, M
shared_arr = shared_arr_ # must be inherited, not passed as an argument
N = N_
M = M_
def tonumpyarray(mp_arr, dtype=np.float32): # change type
return np.frombuffer(mp_arr.get_obj(), dtype)
def g(params):
"""no synchronization."""
print("Current File Name: ", params[0])
tmp_dataset = xr.open_dataset(params[0])
print(tmp_dataset["x"].data[:])
arr = tonumpyarray(shared_arr).reshape(N, M) # reshape
arr[params[1], :] = tmp_dataset["x"].data[:]
tmp_dataset.close()
if __name__ == '__main__':
mp.freeze_support()
main()
关于python - 使用 Xarray 和 Numpy 数组进行多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083743/
假设我有以下二维数组 >>> import numpy as np >>> budgets = np.array([ [np.nan, 450.], [500. , 10
我正在尝试读取单个 WRF 的时间序列输出变量。时间序列是分布式的,每个文件一个时间戳,跨越 5000 多个 netCDF 文件。每个文件包含大约 200 个变量。 有没有办法只为我感兴趣的变量调用
我有一个相当大的 xr.Dataset,其中包含大约 20 个数据变量。我只对保留其中两个感兴趣。我看到 xr.Dataset.drop带有数据集的删除变量。 我正在寻找保留变量的语法。我尝试了 f[
我正在尝试计算 xarray 数据集中时间维度子集的每月气候。时间是使用 datetime64 定义的。 如果我想使用整个时间序列,这很好用: monthly_avr=ds_clm.groupby('
我有一个空间数据的 pandas 数据框,我想将其转换为 netCDF。我找到了 xarray 并将我的数据帧转换为 xarray 数据集的方法: # create xray Dataset from
我有一个名为 rio 的 DataArray 对象。 In [59]: rio Out[59]: array([[[0, 0, ..., 0, 0], [0, 0, ..., 0,
我目前正在尝试将一个大的多维数组 (>5 GB) 加载到 python 脚本中。由于我将数组用作机器学习模型的训练数据,因此以小批量高效加载数据非常重要,但要避免将整个数据集加载到内存中一次。 我的想
假设我有一个 dataset类型 xarray.Dataset .我有一个名为 name 的维度,(由 DataArray 中的所有 Dataset 共享,但我认为这对这个问题并不重要,)我想选择一个
我想读入 https://hrrrzarr.s3.amazonaws.com/index.html#sfc/20210208/20210208_00z_anl.zarr/ 的远程 zarr 存储。 z
我想获取栅格(卫星图像)数据,并构建一个Dataset 或DataArray,以加快我的图像处理速度(我必须处理多-波段,多日期卫星图像很多)。 数据来自每个图像日期的单独波段,我了解如何将每个波段日
所以我有 3 个 netcdf4 文件(每个大约 90 MB),我想使用包 xarray 将它们连接起来。每个文件都有一个变量 (dis),以 0.5 度分辨率(纬度、经度)表示 365 天(时间)。
对于我的数据数组,我有坐标经度、纬度和时间。我只想沿纬度反转数组,以便 [90, 85, ..., -85, -90]变成 [-90, -80, ..., 85, 90] . 最佳答案 同意@jham
完成 MetPy 横截面示例后,我尝试将该示例推广到 NCEP NAM-12km GRIB2 文件,但未成功。通过将我的文件的 DataArray 与示例文件(netCDF 文件)进行比较,我发现 x
我正在使用 xarray.apply_ufunc() 将函数应用于 xarray.DataArray .它适用于某些 NetCDF,但在尺寸、坐标等方面似乎具有可比性的其他 NetCDF 会失败。但是
是否也可以创建一个核外 DataArray,并使用 xarray 将其逐块写入 NetCDF4 文件? 例如,当维度更大时,我希望能够以核外方式执行此操作,因此我无法将整个数组存储在内存中: num_
我有一个数据数组arr,坐标为“时间”。到达: array([244.40161, 244.39998, ..., 244.40936, 244.40549], dtype=float32)
我有一个数据数组arr,坐标为“时间”。到达: array([244.40161, 244.39998, ..., 244.40936, 244.40549], dtype=float32)
我是新手,我使用的是XARRAY。我的netcdf文件包含时间为‘天数自0001-01-01 00:00:00’的数据,日历类型为Julian。有谁知道将时间转换成标准日历的简单方法吗?。提前感谢:)
我是新手,我使用的是XARRAY。我的netcdf文件包含时间为‘天数自0001-01-01 00:00:00’的数据,日历类型为Julian。有谁知道将时间转换成标准日历的简单方法吗?。提前感谢:)
我是新手,我使用的是XARRAY。我的netcdf文件包含时间为‘天数自0001-01-01 00:00:00’的数据,日历类型为Julian。有谁知道将时间转换成标准日历的简单方法吗?。提前感谢:)
我是一名优秀的程序员,十分优秀!