NBC
NBC

Reputation: 1698

How to format numpy arrays?

I have data that looks like this

listL= array([array([-12939613.07220617,   3962855.50690994]),
       array([-12939614.67349505,   3962828.80807231]),
       array([-12939484.00289515,   3962828.1637531 ]),
       array([-12939484.98046737,   3962854.91251931]),

print(type(listL)) -> <class 'numpy.ndarray'>
print(type(listL[0])) -> <class 'numpy.ndarray'>
print(type(listL[0][0])) -> <class 'numpy.float64'>

I have a second piece of data that looks like this:

A = array([[ 73.87682896,   8.55827956],
       [ 57.43741519,  10.40224912],
       [ 87.88970753,  75.42971056],

print(type(A)) -> <class 'numpy.ndarray'>
print(type(A[0])) -> <class 'numpy.ndarray'>
print(type(A[0][0])) -> <class 'numpy.float64'>

The types are the same across both sets of data, but I have a function that works with 'A', but not with 'listL' and I cannot figure out why.

A[spatial.KDTree(A).query(coordinate)[1]]

works, but

listL[spatial.KDTree(listL).query(coordinate)[1]]

returns the error:

not enough values to unpack (expected 2, got 1)

Upvotes: 0

Views: 809

Answers (1)

Paul Panzer
Paul Panzer

Reputation: 53029

ListL is in some respects a pathological structure, it is an array of arrays where a 2D array is expected.

numpy/scipy goes to some lengths to graciously accept most things that can be interpreted as 2D array, for example if you repace KDTRee(ListL) with KDTree(list(ListL)) it works.

Why does it work? Because list(listL) behaves like most "essentially 2D" structures (like lists of lists etc.). We can send it through array or asarray or asanyarray etc. to obtain a genuine 2D array.

>>> np.array(list(listL))
array([[-12939613.07220617,   3962855.50690994],
       [-12939614.67349505,   3962828.80807231],
       [-12939484.00289515,   3962828.1637531 ],
       [-12939484.98046737,   3962854.91251931]])
>>> np.array(list(listL)).shape
(4, 2)

An array of arrays is one of the few cases left that still trip up the array conversion machinery:

>>> np.array(listL)
array([array([-12939613.07220617,   3962855.50690994]),
       array([-12939614.67349505,   3962828.80807231]),
       array([-12939484.00289515,   3962828.1637531 ]),
       array([-12939484.98046737,   3962854.91251931])], dtype=object)
>>> np.array(listL).shape
(4,)

We can see despite our attempt to convert to an ordinary array, listL keeps reporting its shape as 1D. Which appears to be what triggers the exception you are observing.

Upvotes: 1

Related Questions