scipy.spatial ValueError при попытке запустить kdtree

Предыстория: я пытаюсь запустить ближайшего соседа, используя функцию cKDtree в шейп-файле, который имеет 201 запись с широтой и долготой по набору данных временного ряда из 8760 часов (общее количество часов в году). Я получаю сообщение об ошибке, естественно, я посмотрел его. Я нашел это: scipy.spatial ValueError: x должен состоять из векторов длины %d, но иметь форму %s, что является той же ошибкой, но мне трудно понять, как именно эта ошибка была устранена.

Рабочий процесс: я вытащил координаты x и y из шейп-файла и сохранил их в отдельных массивах с именами x_vector и y_vector. Данные 8760 представляют собой файл hdf5. Я вытащил координаты с помощью h5_coords = np.vstack([meta['latitude'], meta['longitude']]).T.

Теперь я пытаюсь запустить kdtree,

# Run the kdtree to match nearest values
tree = cKDTree(np.vstack([x_vector, y_vector]))
kdtree_indices = tree.query(h5_coords)[1]

но это приводит к той же ошибке трассировки.

Ошибка отслеживания:

Traceback (most recent call last):
File "meera_extract.py", line 45, in <module>
kdtree_indices = tree.query(h5_coords)[1]
File "scipy/spatial/ckdtree.pyx", line 618, in scipy.spatial.ckdtree.cKDTree.query (scipy/spatial/ckdtree.cxx:6996)
ValueError: x must consist of vectors of length 201 but has shape (1, 389880)

Помогите мне, stackoverflow. Ты моя единственная надежда.


person Nikolai    schedule 01.09.2016    source источник
comment
Каков результат x_vector.shape, y_vector.shape и h5_coords.shape?   -  person Mahdi    schedule 01.09.2016
comment
Вместо того, чтобы передавать np.vstack([...]) в cKDTree, сделайте меньший шаг и используйте points = np.vstack([x_vector, y_vector]). Тогда взгляните на points.shape. Это то, что вы ожидаете?   -  person Warren Weckesser    schedule 01.09.2016
comment
x_vector.shape и y_vector.shape — это (201,), а h5_coords.shape — это (1, 389880).   -  person Nikolai    schedule 01.09.2016
comment
Ах, в таком случае np.vstack([x_vector, y_vector]) имеет форму (2, 201). Это означает, что вы проходите cKDTree всего две точки в 201-мерном пространстве.   -  person Warren Weckesser    schedule 01.09.2016
comment
@WarrenWeckesser Я сделал, как вы предложили, vector_pnts = np.vstack([x_vector, y_vector]). Форма теперь (2, 201). Не знаю, что я ищу...   -  person Nikolai    schedule 01.09.2016
comment
vector_pnts = np.vstack([x_vector, y_vector]).T, разве ты не этого хочешь?   -  person Mahdi    schedule 01.09.2016
comment
Используйте np.column_stack() вместо numpy.vstack().   -  person Warren Weckesser    schedule 01.09.2016
comment
Хорошо, это перевернуто, так что теперь vector_pnts.shape (201, 2), но все еще с той же общей ошибкой.   -  person Nikolai    schedule 01.09.2016
comment
Ошибка теперь ValueError: x must consist of vectors of length 2 but has shape (1, 389880)?   -  person Warren Weckesser    schedule 01.09.2016
comment
@WarrenWeckesser ой, да, он изменился с length 201 на length 2   -  person Nikolai    schedule 01.09.2016
comment
h5_coords не является набором точек в двумерном пространстве. Вы должны исправить, как он создается. Вы говорите, что использовали h5_coords = np.vstack([meta['latitude'], meta['longitude']]).T. Это не создание массива правильной формы. Попробуйте использовать column_stack и не транспонируйте. (Чтобы быть уверенным, нам нужно знать форму meta['latitude'].)   -  person Warren Weckesser    schedule 01.09.2016
comment
Потрясающе, спасибо! meta['latitude'].shape это (194940, 1). Выполнение того, что вы предложили, и использование column_stack без транспонирования сработало. h5_coords.shape теперь (194940, 2) и kdtree совпало. Кажется, я застрял на vstack, но column_stack было то, что нужно. Мне нужно прочитать о разнице между ними!   -  person Nikolai    schedule 01.09.2016


Ответы (1)


Так что, похоже, мне нужно прочитать о различиях vstack и column_stack и использовании транспонирования, т.е. .T. Если у кого-то такая же проблема, вот что я изменил, чтобы заставить cKDtree работать. Надеюсь, это поможет, если кто-то еще столкнется с этой проблемой. Большое спасибо за комментарии сообщества, которые помогли решить эту проблему!

Я изменил способ ввода координат hdf5 с vstack на column_stack и удалил транспонирование .T.

# Get coordinates of HDF5 file
h5_coords = np.column_stack([meta['latitude'], meta['longitude']])

Вместо того, чтобы пытаться добавить точки в дерево, я создал новую переменную для их хранения:

# combine x and y
vector_pnts = np.column_stack([x_vector, y_vector])

Затем я запустил kdtree без ошибок.

# Run the kdtree to match nearest values
tree = cKDTree(vector_pnts)
kdtree_indices = tree.query(h5_coords)[1]
person Nikolai    schedule 01.09.2016