我有一个以0s和1s编码的NxM矩阵 - 其中只有1s在各自的位置打印,而0是空格,如下面的矩阵:
m = [[0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0]
[1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1]
我的问题是如何创建一个起点,从0到1发生的变化,以及从每行中从1变为0的变化的结束点。然后打印起点和终点之间的所有1
我有以下代码(不起作用):
nrows, ncols = m.shape #gets the shape of the matrix
for r in range(nrows):
for c in range(ncols):
if m[r,c] == 0 and m[r,c+1] == 1: #checks if there is a 0 first and then a 1 in the next index of the column in the row to create a starting point
start = m[r,c+1]
if m[r,c] == 1 and m[r,c+1] == 0: #checks if there is a 1 first and then a 0 in the next index of the column in the row to create an end point
end = m[r, c+1]
我想要的输出是,例如考虑到拉斯特罗:
它应该在该行中找到0之前打印前1和后1之间的所有内容,不包括0。 所以基本上这个:1 1 1 1 .... 1 1 1 1 1 1 .... 1 1 点(。)表示必须排除的0 所有帮助和建议都将受到高度赞赏。
答案 0 :(得分:1)
您的目标是打印输出还是您的目标是指示1开始和结束位置的标记?如果您的目标只是打印输出,为什么不能简单地说:
m = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
]
for row in m:
for bit in row:
print(bit or ' ', end=' ')
print()
输出
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
在您认为合适时操纵消除1(即' '
空间与''
空字符串之间的零或空格的空格。)
你介意展示/解释我如何获得标记 1开始和结束的地方?
借助于Identify groups of continuous numbers in a list的SO回答,我们可以做到:
for row in m:
indicies = compress(count(), row)
ranges = []
for _, g in groupby(enumerate(indicies), lambda x: x[0] - x[1]):
group = [x[1] for x in g]
ranges.append((group[0], group[-1]))
print(ranges)
输出
[(7, 10)]
[(7, 10)]
[(5, 8)]
[(5, 8)]
[(14, 17)]
[(14, 17)]
[(0, 3), (8, 13), (18, 19)]
答案 1 :(得分:0)
你尚未获得可行的MCVE;我将其转换为Python并提出了解决方案。
取每行,将其向左移一个位置,然后从原始行中减去。这将标记所有转换为1和-1。然后你只需要找到第一个0 => 1的变化,然后在那之后改变1 => 0。根据需要调整指数。
注意:我保持这种低技术含量。如果将列表转换为位图,找到具有XOR的转换,并且注意标记起始值(如果它从1开始,则需要第2和第3个转换),可以大大缩短解决方案,而不是前两个。)
<form ng-if="!loggedIn">
<input type="text" placeholder="Username" ng-model="$parent.username">
<input type="password" placeholder="Password" ng-model="$parent.password">
<button type="submit" data-ng-click="login()">Login</button>
</form>
输出:
m = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
]
for row in range(len(m)):
line = m[row]
first = line[:-1]
shift = line[1:]
diff = [first[i] - shift[i] for i in range(len(first))]
l_bound = diff.index(-1) + 1
r_bound = diff[l_bound:].index(1) + l_bound
print
print row, '\t', line
print '\t', diff
print '\t', l_bound, r_bound
答案 2 :(得分:0)
这是将连续差异变为新数组的直接方法。
coded = np.append(m[:,:1]*2-1, m[:,1:] - m[:,:-1], axis=1)
# [[-1 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 0]
# [-1 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 0]
# [-1 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0]
# [-1 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0]
# [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 -1 0]
# [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 -1 0]
# [ 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 -1 0 0 0 1 0]]
在此数组中,-1表示0的狂欢的开始,1表示1的狂欢的开始。我不清楚你要做什么,但也许这会有所帮助。