我在尝试交错 5x5 阵列时遇到问题。首先,我使空行转到数组的最后一行(它起作用了),然后我尝试使索引最高的行保持在索引较小的行下方,但在该行中:
if pivot_index[i] > pivot_index[line_aux] and line_aux < 5 and i < 5:
在代码中,编译器警告列表索引超出范围,但我不知道为什么(这就是问题),或者如何解决它。下面的算法如下:
import numpy as np
def search_pivot(L):
if (np.nonzero(L)[0]).size == 0:
return -1
else:
return np.nonzero(L)[1][0]
def find_pivot_index(mat):
pivot = []
for i in range(5):
pivot.append(search_pivot(np.array(mat[i])))
return pivot
mat = np.matrix([[0,5,2,7,8],[0,0,4,14,16],[0,0,0,0,0],[2,6,10,16,22],[3,5,8,9,15]]).astype(float)
print("Original array:\n",mat,"\n")
pivot_index = find_pivot_index(mat)
line_aux = 0
for i in range(5):
line_aux = line_aux + 1
if pivot_index[i] > pivot_index[line_aux] and line_aux < 5 and i < 5:
m = mat.tolist()
(m[i],m[linha_aux]) = (m[linha_aux],m[i])
mat = np.matrix(m)
pivot_index = find_pivot_index(mat)
print(mat,"\n")
line_aux = 0
for i in range(5):
line_aux = line_aux + 1
if pivot_index[i] == -1 and line_aux < 5 and i < 5:
m = mat.tolist()
(m[i],m[linha_aux]) = (m[linha_aux],m[i])
mat = np.matrix(m)
pivot_index = find_pivot_index(mat)
print(mat)
and
python中的运算符是一个短路布尔运算符
这意味着and
如果左侧是,它只会继续评估右侧的部分True
;如果左侧是False
,由于这完全确定了布尔运算的结果,因此不会评估右侧部分。这允许程序员在左侧执行测试,然后再进行可能导致错误的更具“风险”的评估。
在您的代码中,您将在风险操作之后进行测试。在您尝试使用 5 的 linha_aux进行索引后linha_aux
,您正在检查(无论这意味着什么)是否小于5。(当 i = 4 时会发生这种情况,因为循环的第一行是递增.pivos_indices
linha_aux
所以:
为了“简单地”避免“索引不足”错误,请在有风险的操作之前进行测试:
if line_aux < 5 and i < 5 and pivot_index[i] > pivot_index[line_aux]:
linha_aux
如果这对您的算法更有意义,您可能需要考虑实际上您是否打算在循环结束时而不是在开始时增加;记住python数组是0索引的
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句