Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot convert list to array: ValueError: only one element tensors can be converted to Python scalars

I'm currently working with the PyTorch framework and trying to understand foreign code. I got an indices issue and wanted to print the shape of a list.
The only way of doing so (as far as Google tells me) is to convert the list into a numpy array and then getting the shape with numpy.ndarray.shape().

But trying to convert my list into an array, I got a ValueError: only one element tensors can be converted to Python scalars.

My List is a converted PyTorch Tensor (list(pytorchTensor)) and looks somewhat like this:

[
tensor([[-0.2781, -0.2567, -0.2353,  ..., -0.9640, -0.9855, -1.0069],  
        [-0.2781, -0.2567, -0.2353,  ..., -1.0069, -1.0283, -1.0927],  
        [-0.2567, -0.2567, -0.2138,  ..., -1.0712, -1.1141, -1.1784],  
        ...,  
        [-0.6640, -0.6425, -0.6211,  ..., -1.0712, -1.1141, -1.0927],  
        [-0.6640, -0.6425, -0.5997,  ..., -0.9426, -0.9640, -0.9640],  
        [-0.6640, -0.6425, -0.5997,  ..., -0.9640, -0.9426, -0.9426]]),

tensor([[-0.0769, -0.0980, -0.0769,  ..., -0.9388, -0.9598, -0.9808],  
        [-0.0559, -0.0769, -0.0980,  ..., -0.9598, -1.0018, -1.0228],    
        [-0.0559, -0.0769, -0.0769,  ..., -1.0228, -1.0439, -1.0859],  
        ...,  
        [-0.4973, -0.4973, -0.4973,  ..., -1.0018, -1.0439, -1.0228],  
        [-0.4973, -0.4973, -0.4973,  ..., -0.8757, -0.9177, -0.9177],  
        [-0.4973, -0.4973, -0.4973,  ..., -0.9177, -0.8967, -0.8967]]),

tensor([[-0.1313, -0.1313, -0.1100,  ..., -0.8115, -0.8328, -0.8753],  
        [-0.1313, -0.1525, -0.1313,  ..., -0.8541, -0.8966, -0.9391],  
        [-0.1100, -0.1313, -0.1100,  ..., -0.9391, -0.9816, -1.0666],  
        ...,  
        [-0.4502, -0.4714, -0.4502,  ..., -0.8966, -0.8966, -0.8966],  
        [-0.4502, -0.4714, -0.4502,  ..., -0.8115, -0.8115, -0.7903],  
        [-0.4502, -0.4714, -0.4502,  ..., -0.8115, -0.7690, -0.7690]]),
] 

Is there a way of getting the shape of that list without converting it into a numpy array?

like image 616
Henning Avatar asked Aug 29 '18 09:08

Henning


People also ask

How do you fix TypeError only size 1 arrays can be converted to Python scalars?

TypeError occurs when you pass an array instead of passing a single value in the function or when you are working on NumPy and matplotlib. pyplot. To fix this, add the code and it returns vector results.

How do you convert a list into a tensor?

To convert a Python list to a tensor, we are going to use the tf. convert_to_tensor() function and this function will help the user to convert the given object into a tensor. In this example, the object can be a Python list and by using the function will return a tensor.

What is Torch cat?

torch. cat (tensors, dim=0, *, out=None) → Tensor. Concatenates the given sequence of seq tensors in the given dimension. All tensors must either have the same shape (except in the concatenating dimension) or be empty. torch.cat() can be seen as an inverse operation for torch.


2 Answers

It seems like you have a list of tensors. For each tensor you can see its size() (no need to convert to list/numpy). If you insist, you can convert a tensor to numpy array using numpy():

Return a list of tensor shapes:

>> [t.size() for t in my_list_of_tensors]

Returns a list of numpy arrays:

>> [t.numpy() for t in my_list_of_tensors]

In terms of performance, it is always best to avoid casting of tensors into numpy arrays, as it may incur sync of device/host memory. If you only need to check the shape of a tensor, use size() function.

like image 124
Shai Avatar answered Sep 20 '22 19:09

Shai


The simplest way to convert pytorch tensor to numpy array is:

nparray = tensor.numpy()

Also, for size and shape:

tensor_size = tensor.size()
tensor_shape = tensor.shape()
tensor_size
>>> (1080)
tensor_shape
>>> (32, 3, 128, 128)
like image 29
Koke Cacao Avatar answered Sep 18 '22 19:09

Koke Cacao