调整矩阵大小的特定方法

时间:2013-11-22 14:24:57

标签: python matrix resize

nxn (下例中的 6x6 )矩阵仅填充0和1:

old_matrix=[[0,0,0,1,1,0],
            [1,1,1,1,0,0],
            [0,0,1,0,0,0],
            [1,0,0,0,0,1],
            [0,1,1,1,1,0],
            [1,0,0,1,1,0]]

我想以特定方式调整大小。取(2x2)子矩阵并检查是否有更多的1或0。这意味着新矩阵将是(3x3)如果在子矩阵中存在多于1的0,则在新矩阵中将分配1值。否则,(如果少于或等于),其新值将为0.

new_matrix=[[0,1,0],
            [0,0,0],
            [0,1,0]]

我试图通过使用很多时间来实现这一目标。但它似乎没有用。这是我到目前为止所得到的:

 def convert_track(a):

   #converts original map to a 8x8 tile Track

   NEW_TRACK=[]
   w=0 #matrix width
   h=0 #matrix heigth
   t_w=0 #submatrix width
   t_h=0 #submatrix heigth
   BLACK=0 #number of ones in submatrix
   WHITE=0 #number of zeros in submatrix
   while h<=6:
       while w<=6:
           l=[]
           while t_h<=2 and h<=6:
               t_w=0
               while t_w<=2 and w<=6:
                   if a[h][w]==1:
                       BLACK+=1
                   else:
                       WHITE+=1
                   t_w+=1
                   w+=1
                   h+=1
                   t_h+=1
               t_w=0
               t_h+=1
           if BLACK<=WHITE:
               l.append(0)
           else:
               l.append(1)
           BLACK=0
           WHITE=0
           t_h=0     
       NEW_TRACK.append(l)
   return NEW_TRACK 

将错误列表索引提升到范围或返回列表

[[0]]

有更简单的方法来实现这一目标吗?我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您愿意/能够使用NumPy,您可以做这样的事情。如果你正在使用你所展示的数据之类的东西,那么值得花时间学习,因为像这样的操作可以非常高效地完成并且代码非常少。

import numpy as np
from scipy.signal import convolve2d

old_matrix=[[0,0,0,1,1,0],
            [1,1,1,1,0,0],
            [0,0,1,0,0,0],
            [1,0,0,0,0,1],
            [0,1,1,1,1,0],
            [1,0,0,1,1,0]]

a = np.array(old_matrix)
k = np.ones((2,2))

# compute sums at each submatrix
local_sums = convolve2d(a, k, mode='valid')

# restrict to sums corresponding to non-overlapping
# sub-matrices with local_sums[::2, ::2] and check if
# there are more 1 than 0 elements
result = local_sums[::2, ::2] > 2

# convert back to Python list if needed
new_matrix = result.astype(np.int).tolist()

结果:

>>> result.astype(np.int).tolist()
[[0, 1, 0], [0, 0, 0], [0, 1, 0]]

这里我使用convolve2d来计算每个子矩阵的总和。据我所知,你只对非重叠的子矩阵感兴趣,所以local_sums[::2, ::2]部分只会剔除与那些相对应的总和。