以Fortran连续顺序重塑dask.array

时间:2017-08-03 08:51:34

标签: python arrays numpy reshape dask

我想问一下如何在Fortran-contiguous (column-major) order中重新整形dask数组,因为np.reshape函数的并行版本尚不支持({{3} })。

1 个答案:

答案 0 :(得分:2)

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