按 Fortran 连续顺序重塑 dask.array
Reshaping a dask.array in Fortran-contiguous order
我想问问有没有办法在Fortran-contiguous (column-major) order since the parallelized version of the np.reshape
function is not supported yet (see here).
中重塑dask
数组
Fortran 连续(列优先)顺序只是 C 连续(行优先)顺序的倒转。因此,对于 dask 数组不支持 order='F'
:
这一事实,有一个简单的解决方法
- 转置数组以反转其维度。
- 将其重新塑造成您想要的形状的反面。
- 将其转回。
在函数中:
def reshape_fortran(x, shape):
return x.T.reshape(shape[::-1]).T
用NumPy/dask转置基本上是免费的(它不复制任何数据),所以原则上这个操作应该也很高效。
这里有一个简单的测试来验证它是否正确:
In [48]: import numpy as np
In [49]: import dask.array as da
In [50]: x = np.arange(100).reshape(10, 10)
In [51]: y = da.from_array(x, chunks=5)
In [52]: shape = (2, 5, 10)
In [53]: np.array_equal(reshape_fortran(y, shape).compute(),
...: x.reshape(shape, order='F'))
...:
Out[53]: True
我想问问有没有办法在Fortran-contiguous (column-major) order since the parallelized version of the np.reshape
function is not supported yet (see here).
dask
数组
Fortran 连续(列优先)顺序只是 C 连续(行优先)顺序的倒转。因此,对于 dask 数组不支持 order='F'
:
- 转置数组以反转其维度。
- 将其重新塑造成您想要的形状的反面。
- 将其转回。
在函数中:
def reshape_fortran(x, shape):
return x.T.reshape(shape[::-1]).T
用NumPy/dask转置基本上是免费的(它不复制任何数据),所以原则上这个操作应该也很高效。
这里有一个简单的测试来验证它是否正确:
In [48]: import numpy as np
In [49]: import dask.array as da
In [50]: x = np.arange(100).reshape(10, 10)
In [51]: y = da.from_array(x, chunks=5)
In [52]: shape = (2, 5, 10)
In [53]: np.array_equal(reshape_fortran(y, shape).compute(),
...: x.reshape(shape, order='F'))
...:
Out[53]: True