在Pytorch中我们常常会希望取数据的某些行。这时就要使用到Indexing。
在Numpy中索引可以支持Bool型的索引,例如:
此处的Index是一个numpy array,其元素类型就是我们标题中提及的:numpy,bool_。
但是Pytorch中不支持讲numpy.bool_类型转化为Tensor。这就导致了标题所示的错误:
Type error: can't convert np.ndarray of type numpy.bool_.
一种解决方案是,将numpy.bool_型的index,转化为下标subscript,并利用torch.index_select来进行选择。
举例如下:
X = torch.rand(3, 3)
label = numpy.asarray([1,2,2]) # 注意到X,y的类型差异
print(X)
# 0.1041 0.6888 0.7988
# 0.9398 0.9151 0.7642
# 0.5340 0.4715 0.8128
#[torch.FloatTensor of size (3,3)]
# 0-试图取出第0行
index = (label == 1)
print(type(index)) # 这个numpy.bool_类型是导致问题的原因。
# <class 'numpy.bool_'>
# 1-Numpy语义
X_np = X.numpy()
print(X_np[index])
# array([[0.10411686, 0.6887991 , 0.7988465 ]], dtype=float32)
# 2-Pytorch语义
print(X[torch.tensor(index)])
# TypeError: can't convert np.ndarray of type numpy.bool_.
# 3-index_select的Pytorch语义
subscript = np.where(y==1)[0]
subscript = torch.tensor(subscript)
torch.index_select(X,0,subscript) # 第2个参数是dimension,为0即按行index,为1即按列index。
# 0.1041 0.6888 0.7988
#[torch.FloatTensor of size (1,3)]
当然,一个更好的方式是直接将label转化为Tensor。
然而,许多时候我们获得indexing是在numpy array上操作的,如index = (label == i)
因此本文提供了一种该情形下的折衷方案。