如果它存在于另一个数组中,如何删除数组中的数字

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)