scipy: BUG: cKDtree.query no longer accepts DataFrame as input

Describe your issue.

Under scipy 1.10.1, scipy.spatial.cKDTree.query method accepts a pandas.DataFrame as an input to x. Once updated to 1.11.1 or 1.11.0, this no longer works and returns an error.

1.10.1 does not emit any deprecation on that front and I haven’t found anything in the release notes so I believe this is actually a regression.

Reproducing Code Example

import scipy.spatial
import pandas as pd

points = [
    [66.22, 32.54], 
    [22.52, 22.39], 
    [31.01, 81.21],
    ]

tree = scipy.spatial.cKDTree(points, 10)
tree.query(pd.DataFrame(points), 1)

Error message

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[1], line 11
      4 points = [
      5     [66.22, 32.54], 
      6     [22.52, 22.39], 
      7     [31.01, 81.21],
      8     ]
     10 tree = scipy.spatial.cKDTree(points, 10)
---> 11 tree.query(pd.DataFrame(points), 1)

File _ckdtree.pyx:794, in scipy.spatial._ckdtree.cKDTree.query()

File ~/mambaforge/envs/pointpats_dev/lib/python3.11/site-packages/pandas/core/generic.py:1466, in NDFrame.__nonzero__(self)
   1464 @final
   1465 def __nonzero__(self) -> NoReturn:
-> 1466     raise ValueError(
   1467         f"The truth value of a {type(self).__name__} is ambiguous. "
   1468         "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1469     )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

SciPy/NumPy/Python version and system information

1.11.0 1.24.4 sys.version_info(major=3, minor=11, micro=4, releaselevel='final', serial=0)
Build Dependencies:
  blas:
    detection method: pkgconfig
    found: true
    include directory: /Users/martin/mambaforge/envs/pointpats_dev/include
    lib directory: /Users/martin/mambaforge/envs/pointpats_dev/lib
    name: blas
    openblas configuration: unknown
    pc file directory: /Users/martin/mambaforge/envs/pointpats_dev/lib/pkgconfig
    version: 3.9.0
  lapack:
    detection method: pkgconfig
    found: true
    include directory: /Users/martin/mambaforge/envs/pointpats_dev/include
    lib directory: /Users/martin/mambaforge/envs/pointpats_dev/lib
    name: lapack
    openblas configuration: unknown
    pc file directory: /Users/martin/mambaforge/envs/pointpats_dev/lib/pkgconfig
    version: 3.9.0
  pybind11:
    detection method: pkgconfig
    include directory: /Users/martin/mambaforge/envs/pointpats_dev/include
    name: pybind11
    version: 2.10.4
Compilers:
  c:
    commands: arm64-apple-darwin20.0.0-clang
    linker: ld64
    name: clang
    version: 15.0.7
  c++:
    commands: arm64-apple-darwin20.0.0-clang++
    linker: ld64
    name: clang
    version: 15.0.7
  cython:
    commands: cython
    linker: cython
    name: cython
    version: 0.29.35
  fortran:
    commands: /Users/runner/miniforge3/conda-bld/scipy-split_1687763513919/_build_env/bin/arm64-apple-darwin20.0.0-gfortran
    linker: ld64
    name: gcc
    version: 12.2.0
  pythran:
    include directory: ../../../_build_env/venv/lib/python3.11/site-packages/pythran
    version: 0.13.1
Machine Information:
  build:
    cpu: x86_64
    endian: little
    family: x86_64
    system: darwin
  cross-compiled: true
  host:
    cpu: arm64
    endian: little
    family: aarch64
    system: darwin
Python Information:
  path: /Users/martin/mambaforge/envs/pointpats_dev/bin/python
  version: '3.11'

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 26 (23 by maintainers)

Commits related to this issue

Most upvoted comments

I am +1 on deprecating a path. We should not have n functions doing the same thing. It’s confusing for users and costly for us.

A new deprecation @j-bowhay 😃

I don’t know enough about the legacy but if both are doing the same, why not deprecating it? We have subzillions of similar warnings emitted at each version anyways. It won’t be the first to disappear from the namespace.

KDTree used to be a pure Python implementation that had more methods than cKDTree. It was a pure Cython version that only had the query method. Now, KDTree is a wrapper for cKDTree, which is a Cython wrapper for C++ code. So today we only need to export KDTree in the API. We still have cKDTree in the API for backwards compatibility. We cannot deprecate cKDTree as such, it is needed internally, but we can deprecate it in the exported API.