Pytorch中 can't convert np.ndarray of type numpy.bool_. 导致的Indexing错误

在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_类型是导致问题的原因。

# 
 
# 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)

因此本文提供了一种该情形下的折衷方案。

你可能感兴趣的:(深度学习,python)