从Python列表中删除Numpy对象

从Python列表中删除Numpy对象,python,list,Python,List,我有一个(x,y)坐标列表: [[120.027954 167.9987 ] [918.95233 175.37206 ] [918.14026 540.6017 ] [113.1368 535.2902 ]] 我想一次删除一行: centers = list(centers) top_left = min(centers, key=sum) print("top_left ", top_left) centers.remove(top_left) bottom_ri

我有一个(x,y)坐标列表:

[[120.027954 167.9987  ]
 [918.95233  175.37206 ]
 [918.14026  540.6017  ]
 [113.1368   535.2902  ]] 
我想一次删除一行:

centers = list(centers)

top_left = min(centers, key=sum)
print("top_left ", top_left)
centers.remove(top_left)

bottom_right = max(centers, key=sum)
print("bottom_right ", bottom_right)
centers.remove(bottom_right)
在上面的最后一行,我得到了这个错误:

('top_left ', array([120.027954, 167.9987  ], dtype=float32))
('bottom_right ', array([918.14026, 540.6017 ], dtype=float32))    
centers.remove(bottom_right) 
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

我不知道为什么居中。删除(左上)有效,但不居中。删除(右下)?

Python删除函数经过优化,首先检查身份检查,然后检查相等性。因此,对于
alist.remove(item)
首先检查
item是alist[0]
(身份检查,查找内存位置),然后检查
item==alist[0]
(相等检查,查看实际值))

但是,对于numpy数组,相等性被numpy覆盖以返回每项检查。(矢量化检查。
np.array([1,2])==np.array([2,2])
返回
np.array([False,True])
)这不能由remove函数处理,因为它只需要一个布尔值

但是,Identity仍然适用于numpy阵列。所以对于你的第一个案例,你很幸运,确切的元素就是第一个元素。对于第二种情况,它必须检查多个元素,但在第一次检查相等性时,在初始身份检查之后,它收到一个布尔向量,并且未能抛出“模糊”错误

在您的特定情况下,我建议您为您的操作提取索引,然后使用pop

ind = min(range(len(centers)), key=lambda ind: sum(centers[ind]))
对于其他人来说,最好自己编写一个带有相等性循环检查的自定义函数,而不是默认为numpy相等函数

编辑:

在这种特殊情况下,还可以使用(优化的)内置numpy函数实现另一种更高性能的解决方案

summed_centers = centers.sum(axis=1)
mask = np.ones(len(summed_centers), np.bool_)
mask[[summed_centers.argmax(), summed_centers.argmin()]] = np.bool_(False)
new_centers = centers[mask]
编辑2:


如果您现在没有,则有一个
np.delete
函数,它可以执行相同的操作,但无需显式生成掩码数组,但文档首选掩码数组,因为
np.delete
始终生成数据的副本

您提供了不一致的代码
打印(“右下角”
和输出
('bottom_left',
…为什么不使用带有索引的pop作为参数..因为centers是一个列表,您的描述似乎不完整。您的列表突然变成了NumPy对象?请发布一个最小的完整且可复制的示例。因为这确实是错误的原因,最好更改标题和描述以解释citly声明您正在从Python列表中删除一个NumPy对象,以便其他有相同问题的人也能找到这个答案。我试图不进行循环检查,但由于NumPy数组不能与remove函数一起使用,我想我别无选择!感谢您的详细解释。@adamle在您的特定情况下,我想您是对的仍然不必循环。请参阅我的编辑。