减少ndarray中的一个维度

时间:2018-05-25 15:30:35

标签: python numpy numpy-ndarray

我将点坐标存储在一个三维数组中:
(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] ]

那么,如何从ab形式?现在我的解决方案是创建一个列表,然后将其转换为numpy的数组:

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

这有效,但我认为必须有一种更简单,更清洁的方式......

UPD。最初我试图做一个简单的理解:b = [p[0] for p in a] - 但后来b被证明是一个列表,而不是一个数组 - 我认为这是因为原来的a数组是来自ndarray

numpy

4 个答案:

答案 0 :(得分:3)

如果你想要使用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)

修改

哦,如果它是一个numpy数组,那么肯定使用这种方法。如果您确定它不是空的,请使用.squeeze()

答案 1 :(得分:2)

这是使用列表理解的另一种解决方案:

b = [x[0] for x in a]

答案 2 :(得分:2)

如果您稍后要使用numpy,那么最好避免列表理解。此外,尽可能自动化事物总是很好的做法,因此不要手动选择单身维度,而是让numpy照顾: b=numpy.array(a).squeeze() 除非您需要保留其他单身尺寸。

答案 3 :(得分:1)

为了在你调用它们时展平“嵌套的二维数组”,你只需要得到第一个元素。 arr[0]

以多种方式应用此概念:

  • 列表理解(表现最佳):flatter_a_compr = [e[0] for e in a]
  • 迭代(表现第二好):

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

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