python - 如何在Python中 reshape 列表中的多个数组

标签 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

我只是觉得这不是最有效的方法,而且我确实意识到切片会失去值(value),但我希望如此。

最佳答案

我构建了一个示例列表

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 迭代,但是是在编译后的代码中。

关于python - 如何在Python中 reshape 列表中的多个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40820435/

相关文章:

python - 定制融化/折叠 Pandas

python - 使用 Python Matplotlib 使用起点、终点、中心和半径将圆弧绘制为多边形

python - 对python中的lambda表达式感到困惑

Python 类型错误 : unsupported operand type(s) for +: 'NoneType' and 'str'

python - 字典解包在三元表达式的一个分支中不起作用

python - 在 NumPy 中将行向量转换为列向量

python - 如何使用数组查找对函数进行矢量化

python - 如何删除 numpy 数组中的列?

python - 无法将文档添加到 Solr : Solr responded with an error (HTTP 400) (django + haystack + solr)

python - 在 cython 中迭代数组,列表是否比 np.array 更快?