我有一个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
我觉得这不是最有效的方式,而且我确实意识到我通过切片来失去价值,但我希望如此。
答案 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.hstack
和np.vstack
(以及其他)的代码。他们执行一个或多个列表推导,将所有输入数组按到正确的形状。然后他们做np.concatenate
迭代,但是在编译的代码中。