如果它存在于另一个数组中,如何删除数组中的数字
How to remove numbers in an array if it exists in another another
到目前为止,这是我的代码。 (对数组使用 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
正在缩小,所以在第一次删除后会发生这种情况。我该如何解决这个问题?
当您从数组中删除项目时,数组会变小,但您的 for 循环并不知道这一点,因为它正在遍历数组的原始大小。所以你得到了一个越界错误。所以我会避免使用 for 循环并从我正在迭代的数组中删除。
我的解决办法是使用一个包含允许元素的临时数组,然后将其赋值给原来的数组名
temporary_array=list()
for element in array:
If element in another_array: # you can do this in Python
continue # ignore it
temporary_array.append(element)
array=temporary_array
结果 array
将只有 another_array
中不存在的元素
您还可以使用 列表理解:
temporary_array = [ element for element in array if element not in anther_array ]
array = temporary_array
使用花式 python 语法的相同概念
另一种选择是使用内置函数 filter()
,它采用过滤函数和数组以及 returns 过滤后的数组。在下文中,我使用了 lambda
函数符号,这是另一种很好的 Python 语法:
array = filter(lambda x: x not in another_array, array)
由于您正在使用 numpy,您应该在此处寻找 numpy.extract()
方法 https://numpy.org/doc/stable/reference/generated/numpy.extract.html..。例如,使用 numpy.where()、numpy.in1d() 和 numpy.extract() 我们可以;
condition = numpy.where(numpy.in1d(np_array, np_another_array),False,True)
np_array = numpy.extract(condition, np_array)
到目前为止,这是我的代码。 (对数组使用 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
正在缩小,所以在第一次删除后会发生这种情况。我该如何解决这个问题?
当您从数组中删除项目时,数组会变小,但您的 for 循环并不知道这一点,因为它正在遍历数组的原始大小。所以你得到了一个越界错误。所以我会避免使用 for 循环并从我正在迭代的数组中删除。
我的解决办法是使用一个包含允许元素的临时数组,然后将其赋值给原来的数组名
temporary_array=list()
for element in array:
If element in another_array: # you can do this in Python
continue # ignore it
temporary_array.append(element)
array=temporary_array
结果 array
将只有 another_array
您还可以使用 列表理解:
temporary_array = [ element for element in array if element not in anther_array ]
array = temporary_array
使用花式 python 语法的相同概念
另一种选择是使用内置函数 filter()
,它采用过滤函数和数组以及 returns 过滤后的数组。在下文中,我使用了 lambda
函数符号,这是另一种很好的 Python 语法:
array = filter(lambda x: x not in another_array, array)
由于您正在使用 numpy,您应该在此处寻找 numpy.extract()
方法 https://numpy.org/doc/stable/reference/generated/numpy.extract.html..。例如,使用 numpy.where()、numpy.in1d() 和 numpy.extract() 我们可以;
condition = numpy.where(numpy.in1d(np_array, np_another_array),False,True)
np_array = numpy.extract(condition, np_array)