【问题标题】:Flatten numpy array with sub-arrays of different dimensions用不同维度的子数组展平 numpy 数组
【发布时间】:2018-02-28 15:20:37
【问题描述】:

这似乎是一个足够简单的任务,但我还没有找到如何使用numpy 来完成它。考虑示例数组:

import numpy as np
aa = np.array([np.array([13.16]), np.array([1.58 , 1.2]), np.array([13.1]), np.array([1. , 2.6])], dtype=object)

我需要一种通用方法将该数组扁平化为一个由N 元素组成的数组,并使用N=every float in all the sub-arrays。在这种情况下,它将是:

aa = np.array([13.16, 1.58 , 1.2, 13.1, 1. , 2.6])

我已经尝试过np.ndarray.flatten()(尝试了所有“订单”选项))但我得到了相同的未更改的aa 数组。

为什么np.ndarray.flatten() 不起作用,我该如何完成?

解决方案应该尽可能通用,因为我在这里使用的示例 aa 数组实际上会在我的真实代码中填充不同长度的子数组。

【问题讨论】:

  • aa 已经是 1d。 flatten 仅更改 shape。它不会跨此对象 dtype 屏障运行。 concatenate 将数组视为数组列表;这是一个非常不同的操作。

标签: python arrays numpy


【解决方案1】:

您可以使用numpy.hstack

>>> np.hstack(aa)
array([13.16,  1.58,  1.2 , 13.1 ,  1.  ,  2.6 ])

【讨论】:

  • 谢谢科里。知道为什么np.ndarray.flatten() 不起作用吗?它是否仅适用于所有子数组都具有相同维度的数组?文档中没有说明。
  • @Gabriel np.ndarray.flatten() 正在工作。 flatten 从 ndarray 返回一维数组。 aa.ndim 已经是 1,所以 flatten 没有什么可以改变的。 aa 具有数据类型对象,因此 numpy 不知道也不关心它恰好包含数组。您要做的是告诉 numpy 将 aa 的每个元素视为一个数组,并将它们连接到一个新的数据类型浮点数组中,这就是这个答案的作用。
【解决方案2】:

如果所有子数组都是一维的,你也可以使用np.concatenate 来节省一点时间。据我了解np.hstacknp.concatenate 的包装器,如果输入是一维的,它会简化为相同的操作。

np.concatenate(aa)
# array([13.16,  1.58,  1.2 , 13.1 ,  1.  ,  2.6 ])

np.allclose(np.concatenate(aa), np.hstack(aa))
# True
%timeit np.hstack(aa)
5.53 µs ± 28.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.concatenate(aa)
2.2 µs ± 46.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 2020-03-18
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多