代码之家  ›  专栏  ›  技术社区  ›  Vasily A

在一天之内减少一个维度

  •  1
  • Vasily A  · 技术社区  · 6 年前

    我将点坐标存储在三维数组中:
    (UPD)。数组实际上是 numpy -派生 ndarray ,很抱歉在初始版本中出现混淆)

    a = [ [[11,12]], [[21,22]], [[31,32]], [[41,42]] ]
    

    您可以看到,每个坐标对都像 [[11,12]] 当我想要的时候 [11,12] ,也就是说,我的数组应该包含以下内容:

    b = [ [11,12], [21,22], [31,32], [41,42] ]
    

    那么,如何从 a b 形式?目前,我的解决方案是创建一个列表,然后将其转换为 麻木的 :

    b = numpy.array([p[0] for p in a])
    

    这是可行的,但我想一定有一种更简单、更清洁的方法…

    UPD。最初我试图做一个简单的理解: b = [p[0] for p in a] -但是那时 结果是一个列表,而不是一个数组-我想这是因为 数组是 星期五 麻木的

    4 回复  |  直到 6 年前
        1
  •  3
  •   FHTMitchell    6 年前

    如果你 要使用numpy:

    b = np.array(a)[:, 0, :]
    

    这比理解要快。


    好。。。我当然认为会是

    a = np.random.random((100_000, 1, 2)).tolist()
    
    %timeit np.array([x[0] for x in a])
    41.1 ms ± 304 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit np.array(a)[:, 0, :]
    57.6 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit x = np.array(a); x.shape = len(a), 2
    58.2 ms ± 381 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    编辑

    哦,如果它是一个麻木的数组,那么一定要使用这个方法。或使用 .squeeze() 如果你确定它不是空的。

        2
  •  2
  •   MegaIng Mischa Lisovyi    6 年前

    下面是另一个使用列表理解的解决方案:

    b = [x[0] for x in a]
    
        3
  •  2
  •   anishtain4    6 年前

    如果您以后要使用numpy,那么最好避免列表理解。同样,最好的做法是尽可能地实现自动化,因此,不要手动选择singleton维度,而是让numpy负责: b=numpy.array(a).squeeze() 除非有其他单体维度需要保留。

        4
  •  1
  •   Georgy Martijn Pieters    6 年前

    为了在调用它们时扁平化“类似嵌套的二维数组”,只需要获取第一个元素。 arr[0]

    以多种方式应用此概念:

    • 列表理解(最有效): flatter_a_compr = [e[0] for e in a]
    • 迭代(第二最佳性能):

      b =[]
      for e in a:
          b.append(e[0])
      
    • lambda(非蟒蛇): flatter_a = list(map(lambda e : e[0], a))

    • 麻木(表现最差): flatter_a_numpy = np.array(a)[:, 0, :]