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]]
有更简单的方法来实现这一目标吗?我究竟做错了什么?
答案 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]
部分只会剔除与那些相对应的总和。