Skip to main content
 首页 » 编程设计

python之减少 ndarray 中的一维

2025年05月04日10lori

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

这行得通,但我认为必须有一种更简单、更清洁的方法……

更新。最初我试图做一个简单的理解:b = [p[0] for p in a] - 但后来 b 结果是一个列表,而不是数组 -我认为这是因为原始 a 数组是 numpy

中的 ndarray

请您参考如下方法:

如果您确实想使用 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() 如果您确定它不为空。