【问题标题】:Get specific elements from ndarray of ndarrays with shape (n,)从形状为 (n,) 的 ndarray 的 ndarray 中获取特定元素
【发布时间】:2016-04-28 02:17:16
【问题描述】:

给定 ndarray:

A = np.array([np.array([1], dtype='f'), 
              np.array([2, 3], dtype='f'), 
              np.array([4, 5], dtype='f'),
              np.array([6], dtype='f'), 
              np.array([7, 8, 9], dtype='f')])

显示为:

A
array([array([ 1.], dtype=float32), array([ 2.,  3.], dtype=float32),
   array([ 4.,  5.], dtype=float32), array([ 6.], dtype=float32),
   array([ 7.,  8.,  9.], dtype=float32)], dtype=object)

我正在尝试从 A 的每个“子数组”的第一个元素创建一个新数组。为了向您展示我的意思,下面是一些使用循环创建我想要的数组的代码。我想尽可能高效地实现相同的目标,因为我的数组 A 非常大(约 50000 个条目)并且我需要多次执行该操作。

B = np.zeros(len(A))
for i, val in enumerate(A):
    B[i] = val[0]
B
array([ 1.,  2.,  4.,  6.,  7.])

【问题讨论】:

    标签: numpy multidimensional-array indexing


    【解决方案1】:

    这是一种将所有元素连接到1D 数组中的方法,然后通过linear-indexing 选择第一个元素。实现看起来像这样 -

    lens = np.array([len(item) for item in A])
    out = np.concatenate(A)[np.append(0,lens[:-1].cumsum())]
    

    瓶颈在于连接部分,但如果有大量长度较小的元素,这可能会被抵消。因此,效率取决于输入数组的格式。

    【讨论】:

    • 谢谢,这是两个答案中最快的。仍然没有我想要的那么快,但绝对比我幼稚的方法有所改进。
    • @jmc 很高兴听到这是对原始方法的改进,太棒了!
    【解决方案2】:

    我建议将您原来的锯齿状数组转换为单个掩码数组:

    B = np.ma.masked_all((len(A), max(map(len, A))))
    
    for ii, row in enumerate(A):
        B[ii,:len(row)] = row
    

    现在你有:

    [[1.0 -- --]
     [2.0 3.0 --]
     [4.0 5.0 --]
     [6.0 -- --]
     [7.0 8.0 9.0]]
    

    你可以这样得到第一列:

    B[:,0].data
    

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2016-05-03
      • 2020-09-23
      • 2016-08-17
      相关资源
      最近更新 更多