Skip to main content

Fast kd-tree implementation with OpenMP-enabled queries

Project description

https://github.com/storpipfugl/pykdtree/actions/workflows/deploy-wheels.yml/badge.svg?branch=master

pykdtree

Objective

pykdtree is a kd-tree implementation for fast nearest neighbour search in Python. The aim is to be the fastest implementation around for common use cases (low dimensions and low number of neighbours) for both tree construction and queries.

The implementation is based on scipy.spatial.cKDTree and libANN by combining the best features from both and focus on implementation efficiency.

The interface is similar to that of scipy.spatial.cKDTree except only Euclidean distance measure is supported.

Queries are optionally multithreaded using OpenMP.

Installation

Pykdtree can be installed via pip:

pip install pykdtree

Or, if in a conda-based environment, with conda from the conda-forge channel:

conda install -c conda-forge pykdtree

Note that by default these packages (the binary wheels on PyPI and the binary package on conda-forge) are only built with OpenMP for linux platforms. To attempt to build from source with OpenMP support do:

export USE_OMP="probe"
pip install --no-binary pykdtree pykdtree

This may not work on some systems that don’t have OpenMP installed. See the below development instructions for more guidance. Disabling OpenMP can be accomplished by setting USE_OMP to "0" in the above commands.

Development Installation

If you wish to contribute to pykdtree then it is a good idea to install from source so you can quickly see the effects of your changes. By default pykdtree is built with OpenMP enabled queries on unix-like systems. On linux this is done using libgomp. On OSX systems OpenMP is provided using the clang compiler (conda environments use a separate compiler).

$ cd <pykdtree_dir>
$ pip install -e .

This installs pykdtree in an “editable” mode where changes to the Python files are automatically reflected when running a new python interpreter instance (ex. running a python script that uses pykdtree). It does not automatically rebuild or recompile the .mako templates and .pyx Cython code in pykdtree. Editing these files requires running the pykdtree/render_template.py script and then rerunning the pip command above to recompile the Cython files.

If installation fails with undefined compiler flags or you want to use another OpenMP implementation you may need to modify setup.py or specify additional pip command line flags to match the library locations on your system.

Building without OpenMP support is controlled by the USE_OMP environment variable

$ cd <pykdtree_dir>
$ export USE_OMP=0
$ pip install -e .

Note evironment variables are by default not exported when using sudo so in this case do

$ USE_OMP=0 sudo -E pip install -e .

Control OpenMP usage

The USE_OMP variable can be set to one of a couple different options. If set to "probe", the installation process (setup.py) will attempt to determine what variant of OpenMP is available based on the compiler being used, the platform being run on, and the Python environment being run with. It will then use the flags specified by one of the other USE_OMP modes. Note that in the case of MacOS, it will also try to identify if OpenMP is available from macports or homebrew and include the necessary include and library paths.

If set to "gcc" or "gomp" then compiler and linking flags will be set appropriately for “GNU OpenMP” (gomp) library. If set to "clang" or "omp" then the flags will be set to support the “omp” library. If set to "msvc" then flags will be set for the Microsoft Visual C++ compiler’s OpenMP variant. For backwards compatibility the previous "1" has the same behavior as "probe". As mentioned above "0" can be used to disable any detection of OpenMP or attempt to compile with it.

Usage

The usage of pykdtree is similar to scipy.spatial.cKDTree so for now refer to its documentation

>>> from pykdtree.kdtree import KDTree
>>> kd_tree = KDTree(data_pts)
>>> dist, idx = kd_tree.query(query_pts, k=8)

The number of threads to be used in OpenMP enabled queries can be controlled with the standard OpenMP environment variable OMP_NUM_THREADS.

The leafsize argument (number of data points per leaf) for the tree creation can be used to control the memory overhead of the kd-tree. pykdtree uses a default leafsize=16. Increasing leafsize will reduce the memory overhead and construction time but increase query time.

pykdtree accepts data in double precision (numpy.float64) or single precision (numpy.float32) floating point. If data of another type is used an internal copy in double precision is made resulting in a memory overhead. If the kd-tree is constructed on single precision data the query points must be single precision as well.

Benchmarks

Comparison with scipy.spatial.cKDTree and libANN. This benchmark is on geospatial 3D data with 10053632 data points and 4276224 query points. The results are indexed relative to the construction time of scipy.spatial.cKDTree. A leafsize of 10 (scipy.spatial.cKDTree default) is used.

Note: libANN is not thread safe. In this benchmark libANN is compiled with “-O3 -funroll-loops -ffast-math -fprefetch-loop-arrays” in order to achieve optimum performance.

Operation

scipy.spatial.cKDTree

libANN

pykdtree

pykdtree 4 threads

Construction

100

304

96

96

query 1 neighbour

1267

294

223

70

Total 1 neighbour

1367

598

319

166

query 8 neighbours

2193

625

449

143

Total 8 neighbours

2293

929

545

293

Looking at the combined construction and query this gives the following performance improvement relative to scipy.spatial.cKDTree

Neighbours

libANN

pykdtree

pykdtree 4 threads

1

129%

329%

723%

8

147%

320%

682%

Note: mileage will vary with the dataset at hand and computer architecture.

Test

Run the unit tests using pytest

$ cd <pykdtree_dir>
$ pytest

Installing on AppVeyor

Pykdtree requires the “stdint.h” header file which is not available on certain versions of Windows or certain Windows compilers including those on the continuous integration platform AppVeyor. To get around this the header file(s) can be downloaded and placed in the correct “include” directory. This can be done by adding the anaconda/missing-headers.ps1 script to your repository and running it the install step of appveyor.yml:

# install missing headers that aren’t included with MSVC 2008 # https://github.com/omnia-md/conda-recipes/pull/524 - “powershell ./appveyor/missing-headers.ps1”

In addition to this, AppVeyor does not support OpenMP so this feature must be turned off by adding the following to appveyor.yml in the environment section:

environment:
global:

# Don’t build with openmp because it isn’t supported in appveyor’s compilers USE_OMP: “0”

Changelog

v1.3.6 : Fix Python 3.11 compatibility and build Python 3.11 wheels

v1.3.5 : Build Python 3.10 wheels and other CI updates

v1.3.4 : Fix Python 3.9 wheels not being built for linux

v1.3.3 : Add compatibility to python 3.9

v1.3.2 : Change OSX installation to not use OpenMP without conda interpreter

v1.3.1 : Fix masking in the “query” method introduced in 1.3.0

v1.3.0 : Keyword argument “mask” added to “query” method. OpenMP compilation now works for MS Visual Studio compiler

v1.2.2 : Build process fixes

v1.2.1 : Fixed OpenMP thread safety issue introduced in v1.2.0

v1.2.0 : 64 and 32 bit MSVC Windows support added

v1.1.1 : Same as v1.1 release due to incorrect pypi release

v1.1 : Build process improvements. Add data attribute to kdtree class for scipy interface compatibility

v1.0 : Switched license from GPLv3 to LGPLv3

v0.3 : Avoid zipping of installed egg

v0.2 : Reduced memory footprint. Can now handle single precision data internally avoiding copy conversion to double precision. Default leafsize changed from 10 to 16 as this reduces the memory footprint and makes it a cache line multiplum (negligible if any query performance observed in benchmarks). Reduced memory allocation for leaf nodes. Applied patch for building on OS X.

v0.1 : Initial version.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pykdtree-1.3.7.post0.tar.gz (84.5 kB view details)

Uploaded Source

Built Distributions

pykdtree-1.3.7.post0-cp311-cp311-win_amd64.whl (49.0 kB view details)

Uploaded CPython 3.11 Windows x86-64

pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_x86_64.whl (269.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.24+ x86-64

pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_i686.whl (259.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.24+ i686

pykdtree-1.3.7.post0-cp311-cp311-macosx_10_9_universal2.whl (104.2 kB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

pykdtree-1.3.7.post0-cp310-cp310-win_amd64.whl (50.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_x86_64.whl (267.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.24+ x86-64

pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_i686.whl (261.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.24+ i686

pykdtree-1.3.7.post0-cp310-cp310-macosx_11_0_x86_64.whl (63.0 kB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pykdtree-1.3.7.post0-cp39-cp39-win_amd64.whl (51.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_x86_64.whl (276.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.24+ x86-64

pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_i686.whl (268.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.24+ i686

pykdtree-1.3.7.post0-cp39-cp39-macosx_11_0_x86_64.whl (63.2 kB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pykdtree-1.3.7.post0-cp38-cp38-win_amd64.whl (50.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_x86_64.whl (289.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.24+ x86-64

pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_i686.whl (280.0 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.24+ i686

pykdtree-1.3.7.post0-cp38-cp38-macosx_11_0_x86_64.whl (62.4 kB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

pykdtree-1.3.7.post0-cp38-cp38-macosx_10_15_x86_64.whl (62.4 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

pykdtree-1.3.7.post0-cp37-cp37m-win_amd64.whl (50.1 kB view details)

Uploaded CPython 3.7m Windows x86-64

pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_x86_64.whl (270.9 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.24+ x86-64

pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_i686.whl (261.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.24+ i686

pykdtree-1.3.7.post0-cp37-cp37m-macosx_11_0_x86_64.whl (61.7 kB view details)

Uploaded CPython 3.7m macOS 11.0+ x86-64

pykdtree-1.3.7.post0-cp37-cp37m-macosx_10_15_x86_64.whl (61.7 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

Details for the file pykdtree-1.3.7.post0.tar.gz.

File metadata

  • Download URL: pykdtree-1.3.7.post0.tar.gz
  • Upload date:
  • Size: 84.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.2

File hashes

Hashes for pykdtree-1.3.7.post0.tar.gz
Algorithm Hash digest
SHA256 eca1d61d33db621ef8027eb691ae88db9c65d196aba4b2cc90c190cb90bb508e
MD5 c9d824eb8a5407f93b7bd732fb7a03fe
BLAKE2b-256 631c806dfcebfc0db12b1dd873aa7b72c9c52b9783e6cc1077947022d9cf0cd7

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 937dfbe8544e4c9efaa95d661eb6969da9bb8497771f38cdf29ecafeb192be4f
MD5 5fea5757ef92f7756cc70a46778fff98
BLAKE2b-256 5abef9f6c1f69b70428965fa40ddd95c0892520e7446149044fcd97012934ba1

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 42ad38a4d5e3f8b170fe21369d59dd2fd615d013693b9dc74043556bd473868c
MD5 3df0a8241c56e8fd7f3c045437cae199
BLAKE2b-256 524125a509ccc5e277846fc4ace7eeb665250a3abb668a617cd3c5efc674179d

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_i686.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp311-cp311-manylinux_2_24_i686.whl
Algorithm Hash digest
SHA256 adbd907f924028068307ecdbe8702932b68e126ee36cb4743cbf4c7077f2b55d
MD5 d5bf2574297cf768d5a1dbdd15826617
BLAKE2b-256 4cb5973b38a297f6601640debd0ac9b07478609d8f2e9ee239c7b05f7c72bd8d

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e88385ea9c2da75c2924e845021ed42d982e065ab11940c635f406dd0c27161d
MD5 611789fd21dd2127c3e7fa53d0304c48
BLAKE2b-256 36139378790ec5d7a84936d7ee2d389d01ce0bc8a3e9b0321f012b211337bdaa

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b5d231a78ce3706c02ed7d14871ef6d9bdacb2539e13afaf49305feb1e2b1aae
MD5 8cdf3e0f6b66236b6805805627048fa4
BLAKE2b-256 367313ec60542137b7aec47e98041e7a36fe4d0aadb70081b967e6143cf6280e

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 f5d8fa3c09f2fc863be79bd57f77cef9ad943ccda0a940cf90a3c12777b36c84
MD5 b3010eecc7eb7f288f465d4601aee425
BLAKE2b-256 2d4ef352dae13c4de33810e7e835bb3738cec2321d23d61102b210537e2f395d

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_i686.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp310-cp310-manylinux_2_24_i686.whl
Algorithm Hash digest
SHA256 85acf2f91faf38da4e1f67ced29dfddacb30b073f31fb9cc5864a630abfda90c
MD5 f331a876d3fe53030cd09ff4f2b05ef7
BLAKE2b-256 5acb03a9f80d6c91db0ea6d7a393010c407d793faaf933a6c4ab6c2f8ca6ea52

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 aad5e6d8a9399370070d18c14688604be14d29902e92bd1433c3cd9afc1d3699
MD5 b2bd1542bc4d31aae8f487e613d10c01
BLAKE2b-256 f305c0673bf0d608ed1c32ea25b20c429c69fe22929e31a35c794e50822d1dd2

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d687fdd4be448b43410486e75ed084efaa6d2f640ed4ed0f44246ab5310916a3
MD5 6bc4bedd28062f799c336cf2b656ab4e
BLAKE2b-256 e26009a4398494e6ec92707cad2bc7c67505b97d205b683364aaf3fdd957f7ad

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 adfa725537354bc5f30a4a8642769390411e20805a589f7020e1dab66f59b728
MD5 fa19c4c0c3bd8136c2d546037a0fd8d0
BLAKE2b-256 a32ebc6a93abe89188f9d751b87557a93edeb4901038a1b65930cc3df8dae9ab

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_i686.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp39-cp39-manylinux_2_24_i686.whl
Algorithm Hash digest
SHA256 5069f5b65943846f1fc8be2fcc856a93e2c329c562945c26464eaa5c1ea93325
MD5 776191b4592aabfd969c10ebd41ee1ac
BLAKE2b-256 5ca310ad11a4e03afc1abcd7395d53332e742aedf406e5863200998c3cf6f05a

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 7313d3a7825975a4384fb5ac4fac99a3ff657441d8916188a6c3c521ab6962a1
MD5 1f19c9be5ba61b2b9aa41fd7866de2a7
BLAKE2b-256 8038c8a1ce31c1ca3aa2165e07100fb1d0460f01f020fda190b34fb420c8eb62

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ac73645de33523740d52054f73f7d0470b6cc21c0ffa4d4646fb9d9a8aec06d7
MD5 65ca07f52ffa243112ca465c5825f719
BLAKE2b-256 01591877bd487bab062e9041751169a65e4d53cb3b7a09107b678dcb3bb0eed7

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 cf011bb63e0d81c171650351fc94a10fa0fcf84ababa704d3996c4c9e8f7513e
MD5 f2c73c043c4aded96d5cb31b6f6e119f
BLAKE2b-256 53678220d00dfc59d7aeb0abda5310c164237434035d75769e056c81f3777558

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_i686.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp38-cp38-manylinux_2_24_i686.whl
Algorithm Hash digest
SHA256 c8f6f87a92eed7bbcd585ca474be246d7fcf761ae3933d414e04d81e22e67cba
MD5 5af6f485ef3c0d12fc088c4c21e4d830
BLAKE2b-256 6cd3267481cae794f33cf17c617ab1d3a0913e52fee36ef5bd900201b98aa546

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 84ceb6684b91f9a9e8eb7fe9a58e02723c1520c78620936a88b2ab727801c219
MD5 3b7739d9db413f577424f5a964f8fd5e
BLAKE2b-256 0ef09dd85a8cb69d0f86ad1c8d1b68d79fb5342cb6a638c550a7b0b09e1105c5

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 43ab166b60b66b79db8c15c2ff107bea527bdf53de5f199bb86d930b8f0b58af
MD5 348932b86d50de150dbd28656972c955
BLAKE2b-256 5ab0da430214e88a308faf4a5d4f3a07853e87c20b41805b411e9d1f00ab85c9

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 d746327d22245a73efa4416418c8629fbee4ae38ec4adb4677923cc3508ba6ef
MD5 f3743e0f397fde1c45ed7ebd40eb35f6
BLAKE2b-256 703685b355d85ae1468e98aa131691a5773f6c9bee88389263be08ee925c5aa3

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 565237e5e3b412ee7ff2ae8d4ea3e6d8954d8f8111c6709dce0cda80157989f9
MD5 a685ccb5cde1353e49aa2559aeea7681
BLAKE2b-256 3fc7cab01a2788caa5ac063bd09be5054c0c71515626de3a19955a398fae091a

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_i686.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp37-cp37m-manylinux_2_24_i686.whl
Algorithm Hash digest
SHA256 bf48e8e4a983a79277c5e7abdd0d5478c52f5d736e67276623c5f1b6c64f792e
MD5 6a032c537c7eb27ff1878e8aafd6b66a
BLAKE2b-256 470320e36be12d7fab3c3f349368af9755ca4cd4433b9f848fde6cd62b09cd5f

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp37-cp37m-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp37-cp37m-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8bf6eca5283c37c8e26daa8f0821c3503422c64aa4ccd0528f1aa5522568ac2a
MD5 a0cf2039b2535634571308e0e24a728c
BLAKE2b-256 039a42490ac48e4e531ffc1d8b037f90e352669ea953d14c9de113aa1d2c6354

See more details on using hashes here.

File details

Details for the file pykdtree-1.3.7.post0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pykdtree-1.3.7.post0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 feceb284971510f8dd32703cfdd4e6de6b1c96aac95e3ac74a3df88f7c6aebe3
MD5 4c86fc8c197afbf65280b82eda96e742
BLAKE2b-256 04c84dfe4b50441bd268b8bde844f666b3414373bcbbf9030826dacb2aaa293e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page