Python 尝试在xarray上应用fftconvolve

Python 尝试在xarray上应用fftconvolve,python,numpy,scipy,python-xarray,xarray,Python,Numpy,Scipy,Python Xarray,Xarray,我有一个3DxarrayDataArray和一个1DxarrayDataArray。三维阵列的一个维度的大小与另一个维度的单个维度的大小相同。我想沿着这些相应的维度应用scipy.signal.fftconvolve。但是我犯了一个错误。下面是一些简单的示例代码: import numpy as np from scipy.signal import fftconvolve import xarray as xr xarr1 = xr.DataArray(np.random.random([1

我有一个3D
xarray
DataArray
和一个1D
xarray
DataArray
。三维阵列的一个维度的大小与另一个维度的单个维度的大小相同。我想沿着这些相应的维度应用
scipy.signal.fftconvolve
。但是我犯了一个错误。下面是一些简单的示例代码:

import numpy as np
from scipy.signal import fftconvolve
import xarray as xr

xarr1 = xr.DataArray(np.random.random([10,20,500]), 
                     dims=('dim1', 'dim2', 'sample'))
xarr2 = xr.DataArray(np.random.random(500), 
                     dims=('sample',))
res = xr.apply_ufunc(fftconvolve, xarr1, xarr2, 
                     input_core_dims=[['sample'], ['sample']], 
                     kwargs={'mode': 'same'}, 
                     vectorize=True)
我想做的就是这样:

res = np.zeros(xarr1.shape)
for i1 in range(xarr1.shape[0]):
    for i2 in range(xarr1.shape[1]):
       res[i1, i2, :] = fftconvolve(xarr1[i1, i2, :], xarr2, mode='same')
但是我在
apply_func
版本中遇到以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-174-4f45f68ab252> in <module>()
    7 xarr2 = xr.DataArray(np.random.random(500), 
    8                      dims=('sample',))
----> 9 res = xr.apply_ufunc(fftconvolve, xarr1, xarr2, input_core_dims=[['sample'], ['sample']], kwargs={'mode': 'same'}, vectorize=True)

~\Anaconda3\envs\dataproc\lib\site-packages\xarray\core\computation.py in apply_ufunc(func, *args, **kwargs)
    932                                      join=join,
    933                                      exclude_dims=exclude_dims,
--> 934                                      keep_attrs=keep_attrs)
    935     elif any(isinstance(a, Variable) for a in args):
    936         return variables_ufunc(*args)

~\Anaconda3\envs\dataproc\lib\site-packages\xarray\core\computation.py in apply_dataarray_ufunc(func, *args, **kwargs)
    209 
    210     data_vars = [getattr(a, 'variable', a) for a in args]
--> 211     result_var = func(*data_vars)
    212 
    213     if signature.num_outputs > 1:

~\Anaconda3\envs\dataproc\lib\site-packages\xarray\core\computation.py in apply_variable_ufunc(func, *args, **kwargs)
    563             raise ValueError('unknown setting for dask array handling in '
    564                              'apply_ufunc: {}'.format(dask))
--> 565     result_data = func(*input_data)
    566 
    567     if signature.num_outputs > 1:

~\Anaconda3\envs\dataproc\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
2737             vargs.extend([kwargs[_n] for _n in names])
2738 
-> 2739         return self._vectorize_call(func=func, args=vargs)
2740 
2741     def _get_ufunc_and_otypes(self, func, args):

~\Anaconda3\envs\dataproc\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
2803         """Vectorized call to `func` over positional `args`."""
2804         if self.signature is not None:
-> 2805             res = self._vectorize_call_with_signature(func, args)
2806         elif not args:
2807             res = func()

~\Anaconda3\envs\dataproc\lib\site-packages\numpy\lib\function_base.py in _vectorize_call_with_signature(self, func, args)
2867 
2868             for output, result in zip(outputs, results):
-> 2869                 output[index] = result
2870 
2871         if outputs is None:

ValueError: setting an array element with a sequence.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
7 xarr2=xr.DataArray(np.random.random(500),
8个dims=(‘样本’,))
---->9 res=xr.apply_ufunc(fftconvolve,xarr1,xarr2,input_core_dims=[['sample'],['sample']],kwargs={'mode':'same'},vectorize=True)
应用程序中的~\Anaconda3\envs\dataproc\lib\site packages\xarray\core\computation.py(func,*args,**kwargs)
932 join=join,
933排除尺寸=排除尺寸,
-->934 keep_attrs=keep_attrs)
935 elif any(参数中a的isinstance(a,变量)):
936返回变量_ufunc(*args)
~\Anaconda3\envs\dataproc\lib\site packages\xarray\core\computation.py在apply\u dataarray\u ufunc中(func,*args,**kwargs)
209
210 data_vars=[getattr(a,'variable',a)表示args中的a]
-->211结果变量=函数(*数据变量)
212
213如果signature.num_输出>1:
应用变量中的~\Anaconda3\envs\dataproc\lib\site packages\xarray\core\computation.py(func,*args,**kwargs)
563 raise VALUERROR('中dask数组处理的设置未知'
564'apply_ufunc:{}'。格式(dask))
-->565结果数据=函数(*输入数据)
566
567如果signature.num_输出>1:
~\Anaconda3\envs\dataproc\lib\site packages\numpy\lib\function\u base.py in\uuuuu调用(self,*args,**kwargs)
2737变量扩展([kwargs[\n]表示名称中的变量])
2738
->2739返回自向量化调用(func=func,args=vargs)
2740
2741定义获取和对象类型(self、func、args):
调用中的~\Anaconda3\envs\dataproc\lib\site packages\numpy\lib\function\u base.py(self、func、args)
2803““位置参数”上对“func”的矢量化调用。”
2804如果self.signature不是None:
->2805 res=self.\u向量化\u调用\u,带有\u签名(func,args)
2806 elif非参数:
2807 res=func()
~\Anaconda3\envs\dataproc\lib\site packages\numpy\lib\function\u base.py in\u vectorize\u call\u带\u签名(self、func、args)
2867
2868用于输出,结果为zip(输出,结果):
->2869输出[索引]=结果
2870
2871如果输出为无:
ValueError:使用序列设置数组元素。

指定
输出\u核心\u dims
解决了这个问题

res = xr.apply_ufunc(fftconvolve, xarr1, xarr2, 
                     input_core_dims=[['sample'], ['sample']], 
                     output_core_dims=[['sample']],
                     kwargs={'mode': 'same'}, vectorize=True)

指定
output\u core\u dims
可解决此问题

res = xr.apply_ufunc(fftconvolve, xarr1, xarr2, 
                     input_core_dims=[['sample'], ['sample']], 
                     output_core_dims=[['sample']],
                     kwargs={'mode': 'same'}, vectorize=True)

这在我给出的示例中是有效的,但是如果我使信号变长,它就不再有效,因为
ValueError:沿维度“sample”的索引不相等。有没有一种方法可以使它在两种不同的长度下工作?你能给出一个片段吗?我提出了一个新的问题:在我给出的示例中,这是有效的,但如果我使信号更长,它就不再有效,带有
ValueError:dimension“sample”的索引不相等
。有没有办法让它在两种不同的长度下工作?你能给我一个片段吗?我提出了一个新问题: