我将点坐标存储在一个三维数组中:
(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
形式?现在我的解决方案是创建一个列表,然后将其转换为numpy
的数组:
b = numpy.array([p[0] for p in a])
这有效,但我认为必须有一种更简单,更清洁的方式......
UPD。最初我试图做一个简单的理解:b = [p[0] for p in a]
- 但后来b
被证明是一个列表,而不是一个数组 - 我认为这是因为原来的a
数组是来自ndarray
numpy
答案 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))
flatter_a_numpy = np.array(a)[:, 0, :]