python 已转换为np.ndarray类型,仍然报错TypeError: unsupported operand type(s) for -: 'int' and 'list'
源代码如下
all_tag = np.array([v for k, v in self.tags.items() if len(v) > 0 ])
self.tags['empty'] = np.all(1 - all_tag, axis=1).astype(np.int32).tolist()
报错如下
Traceback (most recent call last):
File "../../tools/eval.py", line 36, in <module>
dataset = VOTDataset(args.dataset, root)
File "/home/cao/桌面/Code/SiamMask/utils/pysot/datasets/vot.py", line 127, in __init__
meta_data[video]['height'])
File "/home/cao/桌面/Code/SiamMask/utils/pysot/datasets/vot.py", line 52, in __init__
self.tags['empty'] = np.all(1 - all_tag, axis=1).astype(np.int32).tolist()
TypeError: unsupported operand type(s) for -: 'int' and 'list'
明明已经转换为ndarray类型了为什么报错仍然是int和list类型错误,np的广播机制为什么没有见效?
从你输出的数据来看,你的all_tag不是一个纯粹的np数据,里面的一些元素是list对象,所以才导致不能用1-all_tag。所以,你只能是通过两个for循环来实现 self.tags['empty'] 的计算,或者可以尝试一下下面的代码:
self.tags['empty'] = [1-np.array(v) for k, v in self.tags.items() if len(v) > 0 ]
看一下all_tag里的元素是不是维度不一致。很可能里面有不同维度的元素,比如
[
[[1,2,3],[4,5,6]],
[6,7,8],
[4,5,6]
]
all tag里面的元素不一定全是int,你print一下看看。
你要进行运算的数据不符合你的预期
此时大概有这么几种思路:
1.从源头上就把数据处理好。比如数据是从excel读入的,那么把excel搞搞好,不要有非法的数据在里面
2.执行运算之前先处理。前提是你得知道源数据是个什么格式,而你又需要处理成什么格式,不能盲猜
3.不管它原来是多少层,递归处理每一层
到底用什么办法,要根据你项目的性质来选,不是随便选一个就行
毕竟想让代码不报错很容易,但是最终处理结果得是你希望得到的结果才行