Как отформатировать массивы? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть данные, которые выглядят следующим образом

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'>

У меня есть второй фрагмент данных, который выглядит следующим образом:

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'>

Типы одинаковы для обоих наборов данных, но у меня есть функция, которая работает с 'A', но не с 'listL', и я не могу понять, почему.

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

работает, но

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

возвращает ошибку:

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

1 Ответ

0 голосов
/ 08 июня 2018

ListL в некоторых отношениях является патологической структурой, это массив массивов, в которых ожидается двухмерный массив.

numpy/scipy идет на все, чтобы любезно принять большинство вещей, которые можно интерпретировать как2D массив, например, если вы изменили KDTRee(ListL) на KDTree(list(ListL)), он работает.

Почему это работает?Потому что list(listL) ведет себя как большинство "по существу 2D" структур (например, списки списков и т. Д.).Мы можем отправить его через array или asarray или asanyarray и т. Д. Для получения подлинного двумерного массива.

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

Массив массивов - это один из немногих оставшихся случаев, которые все еще приводят в движениеМеханизм преобразования массива:

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

Мы можем видеть, что, несмотря на нашу попытку преобразовать в обычный массив, listL продолжает сообщать о его форме как 1D.Похоже, это вызывает исключение, которое вы наблюдаете.

...