如何在Python中重新整形列表中的多个数组

时间:2016-11-26 16:25:48

标签: python numpy

我有一个3D阵列列表,它们都是不同的形状,但我需要它们都是相同的形状。此外,该形状必须是列表中最小的形状。

例如,具有三个数组的my_list具有形状(115,115,3),(111,111,3)和(113,113,3),那么它们都需要是(111,111,3)。它们都是方形彩色图像,因此它们的形状(x,x,3)。

所以我有两个主要问题:

  • 如何在创建列表时找不到最小的形状数组而不循环或保留变量?
  • 如何有效地将列表中的所有数组设置为最小的形状?

目前我在创建my_list时保留了最小形状的变量,所以我可以这样做:

for idx, img in enumerate(my_list):
    img = img[:smallest_shape,:smallest_shape]
    my_list[idx] = img

我觉得这不是最有效的方式,而且我确实意识到我通过切片来失去价值,但我希望如此。

1 个答案:

答案 0 :(得分:2)

我用

构建了一个样本列表
In [513]: alist=[np.ones((512,512,3)) for _ in range(100)]

并做了一些时间。

收集形状很快:

In [515]: timeit [a.shape for a in alist]
10000 loops, best of 3: 31.2 µs per loop

拿分钟需要更多时间:

In [516]: np.min([a.shape for a in alist],axis=0)
Out[516]: array([512, 512,   3])
In [517]: timeit np.min([a.shape for a in alist],axis=0)
1000 loops, best of 3: 344 µs per loop

切片更快

In [518]: timeit [a[:500,:500,:] for a in alist]
10000 loops, best of 3: 133 µs per loop

现在尝试隔离min步骤。

In [519]: shapes=[a.shape for a in alist]
In [520]: timeit np.min(shapes, axis=0)
The slowest run took 5.75 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 136 µs per loop

当你有对象列表时,迭代是处理所有元素的唯一方法。查看np.hstacknp.vstack(以及其他)的代码。他们执行一个或多个列表推导,将所有输入数组按到正确的形状。然后他们做np.concatenate迭代,但是在编译的代码中。