Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange output from ndarray.shape

I am trying to convert the value of a dictionary to a 1d array using:np.asarray(dict.values()), but when I tried to print the shape of the output array, I have problem. My array looks like this:

dict_values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26])

but the output of array.shape is:

()

by which I was expecting (27,1) or (27,)

after I changed the code to np.asarray(dict.values()).flatten(),the output of array.shape became

(1,)

I have read the document of numpy.ndarray.shape, but can't get a hint why the outputs are like these. Can someone explain it to me? Thx

like image 890
Ciriously Avatar asked Dec 01 '25 02:12

Ciriously


1 Answers

This must be python 3.

From docs

The objects returned by dict.keys(), dict.values() and dict.items() are view objects. They provide a dynamic view on the dictionary’s entries, which means that when the dictionary changes, the view reflects these changes.

The issue is that dict.values() is only returning a dynamic view of the data in dictionary's values, Leading to the behaviour you see.

dict_a = {'1': 1, '2': 2}
res = np.array(dict_a.values())
res.shape #()
res
#Output:
array(dict_values([1, 2]), dtype=object)

Notice that the numpy array isn't resolving the view object into the actual integers, but rather just coercing the view into an array with dtype = object

To avoid this issue, consume the view to get a list, as follows:

dict_a = {'1': 1, '2': 2}
res = np.array(list(dict_a.values()))
res.shape #(2,)
res #array([1, 2])
res.dtype #dtype('int32')
like image 102
Paritosh Singh Avatar answered Dec 04 '25 17:12

Paritosh Singh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!