我有一个图像堆栈存储在尺寸为时间、x、y 的 XArray DataArray 中,我想在其中沿每个像素的时间轴应用自定义函数,以便输出是尺寸为 x、y 的单个图像。
我尝试过: apply_ufunc 但该函数失败,说明我需要首先将数据加载到 RAM 中(即无法使用 Dask 数组)。理想情况下,我希望在内部将 DataArray 保留为 Dask 数组,因为不可能将整个堆栈加载到 RAM 中。确切的错误消息是:
ValueError: apply_ufunc 在参数上遇到 dask 数组,但尚未启用 dask 数组的处理。设置参数或首先使用或
dask将数据加载到内存中.load().compute()
我的代码目前如下所示:
import numpy as np
import xarray as xr
import pandas as pd
def special_mean(x, drop_min=False):
s = np.sum(x)
n = len(x)
if drop_min:
s = s - x.min()
n -= 1
return s/n
times = pd.date_range('2019-01-01', '2019-01-10', name='time')
data = xr.DataArray(np.random.rand(10, 8, 8), dims=["time", "y", "x"], coords={'time': times}) …Run Code Online (Sandbox Code Playgroud) 我试图通过使用另一个具有默认值的哈希来初始化 ruby 中的哈希。我想要一个深副本,但我似乎只得到一个浅副本。
这是一个例子:
DEFAULT_HASH = { a: 0, b: 1 }.freeze
my_hash = DEFAULT_HASH.dup
my_hash[:a] = 4
Run Code Online (Sandbox Code Playgroud)
现在“my_hash”和 DEFAULT_HASH 中的 a 值是 4。我只希望哈希中的值发生变化。
我也尝试过其他方法:
my_hash = {}.merge DEFAULT_HASH
Run Code Online (Sandbox Code Playgroud)
和
my_hash.merge! DEFAULT_HASH
Run Code Online (Sandbox Code Playgroud)
所有这些都会产生相同的效果。实现这种初始化的最佳方法是什么?我还使用嵌套哈希,这增加了一点复杂性。
即我的 DEFAULT_HASH 看起来像:
DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }
Run Code Online (Sandbox Code Playgroud)
这会影响如何做到这一点吗?
编辑:嵌套哈希案例
DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>2, :b=>1}}
a=DEFAULT_HASH.dup
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>2, :b=>1}}
a[:b][:a]=12
=> 12
DEFAULT_HASH
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>12, :b=>1}}
Run Code Online (Sandbox Code Playgroud) 我有RGBA格式的像素数据数组.虽然我已经使用GPU将这些数据转换为灰度(因此所有4个通道都是相同的).
我现在想在OpenCV中使用这个灰度数据,我不想存储4个相同数据的副本.是否可以通过指定步幅从此像素阵列创建cv :: Mat结构.(即每4字节仅读出一次)
我目前正在使用
GLubyte* Img = stuff from GPU;
cv::Mat tmp(height, width, CV_8UC4, Img);
Run Code Online (Sandbox Code Playgroud)
但是这会复制所有数据,还是将现有指针包装成cv :: Mat而不复制它?如果它包装没有副本,那么我将很乐意使用标准的c ++例程将我想要的数据从Img复制到一个新的内存部分,然后将其包装为cv :: Mat.
否则,您会如何建议这样做以减少复制的数据量.
谢谢