【问题标题】:How can I stack up a series of numpy arrays faster?如何更快地堆叠一系列 numpy 数组?
【发布时间】:2020-01-12 17:25:59
【问题描述】:

我有一个xarray DataArray,尺寸如下:

 vals.shape
(210, 587, 1, 1)

它包含 587 个不同日期的 210 个不同物种的单个值。我想形成一个数组,该数组是每天的物种 x 物种,其中在给定的一天,该矩阵的每一行都包含当天物种的相同归一化(总和为一)值(即索引 (i,j) 的给定日期的矩阵包含当天物种j 的值)。我还需要结束数组有一个额外的维度I 并被订购Species x Dates x I x Species

我目前可以通过以下方式实现:

#form a list of species x species matrices:
daily_arrays = [np.array([vals[:, i, 0, 0] for n in range(210)]) for i in 587]

#normalize rows to sum to 1 on each day
daily_arrays = [x / x.sum(axis=1)[:, np.newaxis] for x in daily_arrays]

#stack them up and throw on the `I` dimension
desired_array = np.stack([np.stack(daily_arrays, axis=1)], axis=2)

不幸的是,目前这需要 3 个多小时(瓶颈是构建 daily_arrays 列表)。我怎样才能更有效地表达这一点?

【问题讨论】:

  • 我对xarray不熟悉,你一定要用NumPy做这个吗?
  • @AMC,我不必用 numpy 来做,我总是可以最终转换为需要的任何东西,因此可以将任何东西用于构建步骤。
  • 我总是可以最终转换成需要的东西那么需要什么?
  • 最后,我转换为当前使用xarray 实现的内部数据结构,然后将其写入磁盘。如果可以的话,我什至不需要使用numpy使用原生xarray 类型快速以上
  • 如果我可以使用原生 xarray 类型快速完成上述操作,我什至不需要使用 numpy 可能是,嗯。

标签: python arrays numpy numpy-ndarray python-xarray


【解决方案1】:

您不应该重新回到 python 循环中来重新排列您的 numpy 数组。正如您所发现的,这在大数据集上会很慢。要重新排列列,请使用np.transpose

您可以通过以下方式非常快速地从 (210, 587, 1, 1) 数组转到 (587, 210, 1, 1):

daily_arrays = np.transpose(vals, (1, 0, 2, 3))

这将为您提供每天的一行和每个物种的一列。

有了它,你也可以在没有 python 循环的情况下在 numpy 中进行标准化:

daily_arrays/daily_arrays(axis = 1, keepdims=1)

我不太确定为什么您的数据是 4 维的(为什么不只使用 210 x 587 矩阵)——但我假设您有额外的单值维度的原因。

【讨论】:

  • 谢谢,让我试试这个,看看我是否可以在没有循环的情况下构建相同的所需数组。是的,我想要的数组是 3 维的(实际上),但我需要推一个虚拟的第四维以与另一个 API 兼容。每个日期矩阵中看似冗余的行副本也是如此 - 这是第三方应用程序稍后在磁盘上使用该数组时所期望的结构。
【解决方案2】:

Per Mark 建议避免 python 循环进行重新排列以及花费更多时间在 xarray 文档和解释器上,以下在大约 1 秒内解决问题而无需离开 xarray

vals = vals / vals.sum(dim="species")

desired_array = xarray.concat([vals[:, :, :, :] for n in range(210)], "items")
desired_array = desired_array.transpose("items", "dates", "I", "species")

我不需要插入维度,因为我从最初使用的 210 x 587 x 1 x 1 数组中保留了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多