【问题标题】:Iterate in submatrices through a bigger matrix通过更大的矩阵迭代子矩阵
【发布时间】:2017-08-06 09:04:50
【问题描述】:

我正在寻找一种方法,使用 for 循环可以迭代更大的矩阵,其中每次迭代都会输出一个大小为(行、列、深度)(6、3、3)的子矩阵。

我的大矩阵存储为 numpy 矩阵,并且也可能像这样输出每次迭代。

>>> import numpy as np
>>> a = np.random.rand(6*3,3*3,3)
>>> print a.shape
(18, 9, 3)
>>> print a
>>> b

变量 b 应该包含矩阵 a 中所有大小为 (6,3,3) 的子矩阵。 每个子矩阵不应与先前的重叠。

【问题讨论】:

  • 您在寻找滑动矩阵吗?输入数组中有多少维?你能添加一个示例案例吗?
  • 是的......我想你可以称它为滑动矩阵......维度很好......行总是78(可以被6整除)。列取决于数据长度,但总是可以被 3 整除,深度为 3(实际上是 4 RGBA,但我将 alpha 通道切掉了)
  • 那么,你应该从刚刚编辑的样本数据中得到多少这样的子矩阵?
  • @Divakar 来自较大矩阵的 3 个子矩阵
  • 还是 27?再算一次?

标签: python loops numpy matrix


【解决方案1】:

方法#1

我假设我们正在寻找 non-overlapping/distinct 块。因此我们可以使用Scikit-image's view_as_blocks 实用程序-

from skimage.util.shape import view_as_blocks

BSZ = (6,3,3)
out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ))

示例运行 -

In [279]: a = np.random.rand(6*3,3*3,3)

In [280]: out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ))

In [281]: out.shape
Out[281]: (9, 6, 3, 3)

方法 #2

仅使用原生 NumPy 工具,例如 reshapingtranspose,这是一种方法 -

m,n,r = a.shape
split_shp = m//BSZ[0], BSZ[0], n//BSZ[1], BSZ[1], r//BSZ[2], BSZ[2]
out = a.reshape(split_shp).transpose(0,2,4,1,3,5).reshape((-1,)+ (BSZ))

【讨论】:

  • /usr/local/lib/python2.7/dist-packages/skimage/util/shape.py:94: RuntimeWarning: Cannot provide views on a non-contiguous input array without copying. warn(RuntimeWarning("Cannot provide views on a non-contiguous input "
  • 我应该担心什么?
  • @J.Down 正如警告消息所述,我猜您的输入不是连续的,这取决于输入的来源。所以,为了安全起见,我想你可以使用第二个应用程序,因为内部第一个应用程序正在做类似的事情。
  • ` out = matrix.reshape(split_shp).transpose(0,2,4,1,3,5).reshape((-1,)+ (BSZ)) ValueError: 总大小新数组必须不变`
  • 啊。是的,我必须解决一些问题...由于可读性,我更喜欢方法 1 而不是方法 2。. 是否有可能使可读性更强?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多