下面是我到目前为止的代码(使用NumPy
表示数组)
avail_nums = np.array([1,2,3,4,5,6,7,8,9]) # initial available numbers
# print(avail_nums.shape[0])
# print(sudoku[spaces[x,1],spaces[x,2]]) # index of missing numbers in sudoku
print('\n')
# print(sudoku[spaces[x,1],:]) # rows of missing numbers
for i in range(sudoku[spaces[x,1],:].shape[0]): # Number of elements in the missing number row
for j in range(avail_nums.shape[0]): # Number of available numbers
if(sudoku[spaces[x,1],i] == avail_nums[j]):
avail_nums= np.delete(avail_nums,[j])
print(avail_nums)
一个for
循环遍历'sudoku row'中的所有元素,另一个循环遍历avail_nums
。每次有匹配的值(由if语句给出),该值就从avail_nums
数组中删除,直到最后'sudoku row'中的所有数字都不在avail_nums
中。
我遇到了这个错误:
IndexError: index 8 is out of bounds for axis 0 with size 8
指向if
语句所在的行。由于avail_nums
正在收缩,因此在第一次删除后会发生此问题。如何解决此问题?
1条答案
按热度按时间h7appiyu1#
当你从数组中删除元素时,数组变小了,但是你的for循环并不知道,因为它是在迭代数组的原始大小,所以你得到了一个越界错误,所以我会避免使用for循环,从我迭代的数组中删除。
我的解决方案是使用一个包含允许元素的临时数组,然后将其赋给原始数组名
结果
array
将仅具有another_array
中不存在的元素您也可以使用列表解析:
使用花哨的python语法时,这是同一个概念
另一种选择是使用内置的
filter()
,它接受一个filter函数和一个数组,并返回过滤后的数组,在下面的代码中我使用了lambda
函数符号,这是另一种很好的Python语法:由于您使用的是numpy,因此您应该在https://numpy.org/doc/stable/reference/generated/numpy.extract.html..中查找
numpy.extract()
方法。例如,使用numpy.where()、numpy.in1d()和numpy.extract(),我们可以: