【发布时间】:2016-09-07 21:18:25
【问题描述】:
我有一个仅由零和一组成的二维数组 (Q)。我希望在每行 Q 的 1 之间的每个位置填充 1。这是一个示例:
原矩阵:
[0 0 0 1 0 1]
[1 0 0 0 0 0]
[0 0 0 0 0 0]
[1 1 0 1 0 0]
[1 0 0 0 0 1]
[0 1 1 0 0 1]
[1 0 1 0 1 0]
生成的矩阵:
[0 0 0 1 1 1]
[1 0 0 0 0 0]
[0 0 0 0 0 0]
[1 1 1 1 0 0]
[1 1 1 1 1 1]
[0 1 1 1 1 1]
[1 1 1 1 1 0]
我实现了一个算法,它可以工作,但是对于大型数组它效率不高。
def beetween(Q):
for client in range(len(Q)):
idStart = findIdStart(Q, client)
idEnd = findIdEnd(Q, client)
if idStart != idEnd and idStart > -1 and idEnd > -1:
for i in range(idStart, idEnd):
Q[client][i] = 1
return Q
def findIdStart(Q, client):
if Q.ndim > 1:
l, c = np.array(Q).shape
for product in range (0, c):
if Q[client][product] == 1:
return product
else:
idProduct = 1
Qtemp = Q[client]
if Qtemp[idProduct] == 1:
return idProduct
return -1
def findIdEnd(Q, client):
if Q.ndim > 1:
l, c = np.array(Q).shape
Qtemp = Q[client]
for product in range(0,c):
idProduct = (c-1)-product
if Qtemp[idProduct]==1:
return idProduct
else:
idProduct = 1
Qtemp = Q[client]
if Qtemp[idProduct] == 1:
return idProduct
return -1
我正在尝试构建更优化的版本,但没有成功:
def beetween(Q):
l, c = np.shape(Q)
minIndex = Q.argmax(axis=1)
maxIndex = c-(np.fliplr(Q).argmax(axis=1))
Q = np.zeros(shape=(l,c)).astype(np.int)
for i in range(l):
Q[i, minIndex[i]:maxIndex[i]] = 1
return Q
原矩阵:
[0 0 0 1 0 1]
[1 0 0 0 0 0]
[0 0 0 0 0 0]
[1 1 0 1 0 0]
[1 0 0 0 0 1]
[0 1 1 0 0 1]
[1 0 1 0 1 0]
错误的结果
[0 0 0 1 1 1] # OK
[1 0 0 0 0 0] # OK
[1 1 1 1 1 1] # wrong
[1 1 1 1 0 0] # OK
[1 1 1 1 1 1] # OK
[0 1 1 1 1 1] # OK
[1 1 1 1 1 0] # OK
任何人都可以为这个问题提出另一个简单的解决方案吗?
谢谢。
【问题讨论】:
-
谢谢先生们,所有提出的算法都优雅地解决了这个问题。
标签: python arrays numpy matrix