根据anther数组中的最小值删除数组中的行

时间:2017-08-04 05:01:02

标签: arrays python-3.x numpy

我正在使用python-3.x,我搜索了以下错误但找不到正确的解决方案。

错误是:

IndexError: index 9 is out of bounds for axis 0 with size 9'

所以我正在做的是创建随机二进制数组“二进制”也是一个随机数数组“值”,我想删除二进制数组中最低的两行,基于(索引)中最小的两个值“价值”阵列。

因为我知道我在数组的边界外访问但是解决这个错误的正确方法是什么?

所以在我的代码中,问题出在哪里以及如何解决问题任何帮助都将受到高度赞赏

import random
import numpy as np
np.set_printoptions(threshold=np.nan)


for i in range (100):


    binary= np.random.randint (2, size=(10, 4))
    print("binary:" '\n',binary)


    value = np.random.randint (200, size=(10, 1))
    print("value:" '\n',value)




    for i in range (2):
#       the loseer how have the of the binarys who has the smaslets value 
        loser = np.argmin(value)
#        print ("loser:",loser)
#        print("loser:", loser,(value[loser]))
#        print (binary[loser,])
#        print("Loser=", "Index:", loser,"value:",(value[loser]), "binary:",(binary[loser,]))
        print("Index:", loser)
        print("value:",(value[loser]))
        print("binary:",(binary[loser,]))
        print("Loser=", "Index:", loser,"value:",(value[loser]), "binary:",(binary[loser,]))



        binary = np.delete(binary, (loser), axis=0)
        print("binary:" '\n',binary)

在此代码中,我使用 np.argmin ,因为我不想使用排序。

1 个答案:

答案 0 :(得分:0)

您的代码中的问题是,在for i in range (2)中的第一次迭代后,您删除了binary中的元素,但未删除value中的元素。因此,这些数组不再具有相同的长度,并且它们中的指数不一致。此外,通过在两次迭代中执行loser = np.argmin(value),您只需找到两次相同的最小值,而不是最小的两次。

相反,您可以执行以下操作:

binary= np.random.randint (2, size=(10, 4))
value = np.random.randint (200, size=(10, 1))

ind = np.argpartition(-value.T[0], -2)[-2:]
binary=np.delete(binary,ind,0)

与排序不同,np.argpartition使用Introselect以线性时间运行。它找到k个最大元素的索引(不按排序顺序)。我做了

-value.T[0]

因为您需要2个最小的元素,我还将value重新整形为1D数组,以将其输入np.argpartition