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

rur96b6h  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(147)

下面是我到目前为止的代码(使用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正在收缩,因此在第一次删除后会发生此问题。如何解决此问题?

h7appiyu

h7appiyu1#

当你从数组中删除元素时,数组变小了,但是你的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 another_array ]
array = temporary_array

使用花哨的python语法时,这是同一个概念
另一种选择是使用内置的filter(),它接受一个filter函数和一个数组,并返回过滤后的数组,在下面的代码中我使用了lambda函数符号,这是另一种很好的Python语法:

array = filter(lambda x: x not in another_array, array)

由于您使用的是numpy,因此您应该在https://numpy.org/doc/stable/reference/generated/numpy.extract.html..中查找numpy.extract()方法。例如,使用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)

相关问题