【问题标题】:indexing through an array in blocks通过块中的数组进行索引
【发布时间】:2017-07-21 07:47:02
【问题描述】:

我有一个表示为数组 (img) 的图像,我想制作图像的许多副本,并且在每个副本中将图像的不同正方形归零(在第一个副本中,将 0:2 归零,下一个副本中的 0:2 将 0:2、3:5 等归零。我已经使用 np.broadcast_to 创建了图像的多个副本,但是我无法通过图像的多个副本以及图像中的多个位置来将图像中的正方形归零。

我想我正在寻找类似 skimage.util.view_as_blocks 的东西,但我需要能够写入原始数组,而不仅仅是读取。

这背后的想法是通过神经网络传递图像的所有副本。表现最差的副本应该是我试图在其归零位置识别的类(图片)。

img = np.arange(10*10).reshape(10,10)
img_copies = np.broadcast_to(img, [100, 10, 10])
z = np.zeros(2*2).reshape(2,2)

谢谢

【问题讨论】:

  • 那些different squaresdifferent locations 是如何输入代码的?所有这些正方形的形状都一样吗?
  • 编辑原帖更具体。不同的方块将从左上角开始,并以非重叠的方式覆盖整个阵列。每个正方形的大小相同。谢谢

标签: python-3.x numpy multidimensional-array neural-network


【解决方案1】:

我想我已经破解了!这是一种使用masking 沿6D 重构数组的方法-

def block_masked_arrays(img, BSZ):
    # Store shape params
    m = img.shape[0]//BSZ
    n = m**2

    # Make copies of input array such that we replicate array along first axis.
    # Reshape such that the block sizes are exposed by going higher dimensional.
    img3D = np.tile(img,(n,1,1)).reshape(m,m,m,BSZ,m,BSZ)    

    # Create a square matrix with all ones except on diagonals. 
    # Reshape and broadcast it to match the "blocky" reshaped input array.
    mask = np.eye(n,dtype=bool).reshape(m,m,m,1,m,1)

    # Use the mask to mask out the appropriate blocks. Reshape back to 3D.
    img3D[np.broadcast_to(mask, img3D.shape)] = 0
    img3D.shape = (n,m*BSZ,-1)
    return img3D

示例运行 -

In [339]: img
Out[339]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [340]: block_masked_arrays(img, BSZ=2)
Out[340]: 
array([[[ 0,  0,  2,  3],
        [ 0,  0,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[ 0,  1,  0,  0],
        [ 4,  5,  0,  0],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 0,  0, 10, 11],
        [ 0,  0, 14, 15]],

       [[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9,  0,  0],
        [12, 13,  0,  0]]])

【讨论】:

  • 这行得通,尽管我在遵循您的代码时遇到了麻烦,尤其是在更高维度的情况下。你的功能是如何工作的?谢谢
  • @Aryeh 在那里添加了一些 cmets。
  • 您的功能有效,因此我将其标记为已回答。谢谢你。我仍然不明白您如何使用添加的尺寸,您使用的方法是否有名称,或者您推荐的某个网站,以便我可以了解更多关于您所做的事情?谢谢
  • @Aryeh 我认为不会有任何外部资源。正如文章开头所暗示的那样,大量的反复试验和直觉进入了这一点。所以,我确实理解您的担忧/反馈。我想如果你真的想深入挖掘并了解发生了什么,你可以从一个示例 1D img 开始,然后使用1D windows 并尝试重塑。一旦您对1D 感到满意,请转到2D。祝你好运!
猜你喜欢
  • 2018-05-02
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2018-08-20
  • 2014-03-03
  • 2018-12-25
相关资源
最近更新 更多