Skip to main content

Nearest Neighbor Detection for Bioconductor

Project description

PyPI-Server Monthly Downloads Unit tests

Python bindings to knncolle

Overview

The knncolle Python package implements Python bindings to the C++ library of the same name for nearest neighbor (NN) searches. Downstream packages can re-use the NN search algorithms in knncolle, either via Python or by directly calling C++ through shared pointers. This is inspired by the BiocNeighbors Bioconductor package, which does the same thing for R packages.

Quick start

Install it:

pip install knncolle

And run the desired search:

# Mocking up data with 20 dimensions, 1000 observations
import numpy
y = numpy.random.rand(1000, 20) 

# Building a search index with vantage point trees:
import knncolle
params = knncolle.VptreeParameters()
idx = knncolle.build_index(params, y)

# Performing the search:
res = knncolle.find_knn(idx, num_neighbors=10)

res.index # each row is an observation, each column is a neighbor
## array([[881,  74, 959, ..., 917, 385, 522],
##        [586,   8, 874, ..., 895,  52, 591],
##        [290, 215, 298, ..., 148, 627, 443],
##        ...,
##        [773,  44, 669, ..., 775, 287, 819],
##        [658, 847, 691, ..., 630, 861, 434],
##        [796, 158,  11, ..., 606, 815, 882]],
##       shape=(1000, 10), dtype=uint32)

res.distance # distances to the neighbors in 'index'
## array([[1.12512471, 1.12792771, 1.15229055, ..., 1.21499808, 1.2176659 ,
##         1.23952456],
##        [0.9988856 , 1.03782045, 1.08870223, ..., 1.16899062, 1.17007634,
##         1.17147675],
##        [1.2471501 , 1.26328659, 1.2643019 , ..., 1.32229768, 1.32679721,
##         1.33451926],
##        ...,
##        [1.05765983, 1.08981287, 1.11295647, ..., 1.18395012, 1.1976068 ,
##         1.21577234],
##        [0.96758957, 1.02363497, 1.05326212, ..., 1.21518925, 1.22847612,
##         1.24106054],
##        [1.17846147, 1.22299985, 1.2248128 , ..., 1.35088373, 1.39274142,
##         1.40207528]], shape=(1000, 10))

Check out the reference documentation for details.

Switching algorithms

We can easily switch to a different NN search algorithm by supplying a different params object. For example, we could use the Approximate Nearest Neighbors Oh Yeah (Annoy) algorithm:

an_params = knncolle.AnnoyParameters()
an_idx = knncolle.build_index(an_params, y)

We can also tweak the search parameters in our Parameters object during or after its construction. For example, with the hierarchical navigable small worlds (HNSW) algorithm:

h_params = knncolle.HnswParameters(num_links=20, distance="Manhattan")
h_params.ef_construction = 150
h_idx = knncolle.build_index(h_params, y)

Currently, we support Annoy, HNSW, vantage point trees, k-means k-nearest neighbors, and an exhaustive brute-force search. More algorithms can be added by extending knncolle as described below without any change to end-user code.

Other searches

Given a separate query dataset of the same dimensionality, we can find the nearest neighbors in the prebuilt NN search index:

q = numpy.random.rand(50, 20)
qres = knncolle.query_knn(idx, q, num_neighbors=10)

qres.index.shape # each row is an observation in 'q'
## (50, 10)
qres.distance.shape
## (50, 10)

qres.index[0,:]
## array([712, 947, 924, 506, 640, 228, 424, 662, 299, 473], dtype=uint32)

qres.distance[0,:]
## array([0.9846863 , 0.99493741, 1.01642662, 1.02303339, 1.02915264,
##        1.05241022, 1.0690309 , 1.09889404, 1.1327715 , 1.14832321])

We can ask find_knn() to report variable numbers of neighbors for each observation:

variable_k = (numpy.random.rand(y.shape[0]) * 10).astype(numpy.uint32)
var_res = knncolle.find_knn(idx, num_neighbors=variable_k)

len(var_res.index)
## 1000

len(var_res.distance)
## 1000

variable_k[0]
## np.uint32(7)

var_res.index[0]
## array([881,  74, 959, 135, 148, 946, 276], dtype=uint32)

var_res.distance[0]
## array([1.12512471, 1.12792771, 1.15229055, 1.16210922, 1.19067866,
##        1.19773984, 1.21375003])

We can find all observations within a distance threshold of each observation via find_neighbors(). The related query_neighbors() function handles querying of observations in a separate dataset. Both functions also accept a variable threshold for each observation.

range_res = knncolle.find_neighbors(idx, threshold=1.2)

len(range_res.index)
## 1000

len(range_res.distance)
## 1000

range_res.index[0]
## array([881,  74, 959, 135, 148, 946], dtype=uint32)

range_res.distance[0]
## array([1.12512471, 1.12792771, 1.15229055, 1.16210922, 1.19067866,
##        1.19773984])

Use with C++

The raison d'être of the knncolle Python package is to facilitate the re-use of the neighbor search algorithms by C++ code in other Python packages. The idea is that downstream packages will link against the knncolle C++ interface so that they can re-use the search indices created by the knncolle Python package. This allows developers to (i) save time by avoiding the need to re-compile all desired algorithms and (ii) support more algorithms in extensions to the knncolle framework. To do so:

  1. Add knncolle.includes() and assorthead.includes() to the compiler's include path for the package. This can be done through include_dirs= of the Extension() definition in setup.py or by adding a target_include_directories() in CMake, depending on the build system.
  2. Call knncolle.build_index() to construct a GenericIndex instance. This exposes a shared pointer to the C++-allocated index via its ptr property.
  3. Pass ptr to C++ code as a uintptr_t referencing a knncolle::Prebuilt. which can be interrogated as described in the knncolle documentation.

So, for example, the C++ code in our downstream package might look like this:

#include "knncolle_py.h"

int do_something(uintptr_t ptr) {
    const auto& prebuilt = knncolle_py::cast_prebuilt(ptr)->ptr;
    // Do something with the search index interface.
    return 1;
}

PYBIND11_MODULE(lib_downstream, m) {
    m.def("do_something", &do_something);
}

Which can then be called from Python:

from . import lib_downstream as lib
from knncolle import GenericIndex

def do_something(idx: GenericIndex):
    return lib.do_something(idx.ptr)

In some scenarios, it may be more convenient to construct the search index inside C++, e.g., if the dataset to be searched is not available before the call to the C++ function. This can be accommodated by accepting a uintptr_t to a knncolle::Builder in the C++ code:

#include "knncolle_py.h"

int do_something_mk2(uintptr_t ptr) {
    const auto& builder = knncolle_py::cast_builder(ptr)->ptr;
    // The builder is a algorithm-specific factory that accepts a matrix and
    // returns a search index for that algorithm. Presumably we construct a
    // new search index inside this function and use it.
    return 1;
}

PYBIND11_MODULE(lib_downstream, m) {
    m.def("do_something_mk2", &do_something_mk2);
}

A pointer to the knncolle::Builder can be created by the define_builder() function in Python, and then passed to the C++ code:

from . import lib_downstream as lib
from knncolle import define_builder, Parameters

def do_something(param: Parameters):
    builder, cls = define_builder(param)
    return lib.do_something_mk2(builder.ptr)

Check out the included header for more definitions.

Extending to more algorithms

Via define_builder()

The best way to extend knncolle is to do so in C++. This involves writing subclasses of the interfaces in the knncolle library. Once this is done, it is a simple matter of writing the following Python bindings:

  • Implement a SomeNewParameters class that inherits from Parameters.
  • Implement a SomeNewIndex class that inherits from GenericIndex. This should accept a single ptr in its constructor and have a ptr property that returns the same value.
  • Register a define_builder() method that dispatches on SomeNewParameters. This should call into C++ and return a tuple containing a Builder object and the SomeNewIndex constructor.

No new methods are required for find_knn(), build_index(), etc. as the default method will work automatically if a define_builder() method is available. This approach also allows the new method to be used in C++ code of downstream packages.

Without define_builder()

If it is not possible to implement the search algorithm in C++, we can still extend knncolle in Python. Each extension package should:

  • Implement a SomeNewParameters class that inherits from Parameters.
  • Implement a SomeNewIndex class that inherits from Index. This can have an arbitrary structure, i.e., it does not need to have a ptr property.
  • Register a build_index() method that dispatches on SomeNewParameters. This should return an instance of SomeNewIndex.
  • Register a method for any number of these generics: find_knn(), find_distance(), find_neighbors(), query_knn(), query_distance(), query_neighbors(). These methods should dispatch on SomeNewParameters and return the appropriate result object.

This approach will not support re-use by C++ code in other Python packages.

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

knncolle-0.2.0.tar.gz (41.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

knncolle-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

knncolle-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (230.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

knncolle-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (175.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

knncolle-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl (204.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

knncolle-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

knncolle-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (229.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

knncolle-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (175.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

knncolle-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl (204.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

knncolle-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

knncolle-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (231.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

knncolle-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (176.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

knncolle-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl (205.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

knncolle-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

knncolle-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (229.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

knncolle-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (175.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

knncolle-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (204.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

knncolle-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

knncolle-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (230.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

knncolle-0.2.0-cp39-cp39-macosx_11_0_arm64.whl (175.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

knncolle-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl (204.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file knncolle-0.2.0.tar.gz.

File metadata

  • Download URL: knncolle-0.2.0.tar.gz
  • Upload date:
  • Size: 41.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for knncolle-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1103ce00353ea2aa8e8b7d5116420b53f624a8b3ba1093fa4018a4bb121b752c
MD5 14db7e36168abb652ec2855b7eba03fc
BLAKE2b-256 dd670c30fa135880da9315c11713cb917bb13b8d0c7b693c5600e1660ae186cb

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7bd8494f420b58cd46b08f434da5c6cfbd840cc1cd07b11ee1017b894746f338
MD5 9821351b1b02dc78adc0da4ebdcc5067
BLAKE2b-256 0c861f9bac534d0397f1bc6159f41d0abdf2a648eb8cade8434a621a93517130

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3a15a3b30a7eb120c50c5240339e1ba597a06b1502d5862bd52c24fcd3422c84
MD5 9009fbcb3b23c452d44c8441a9f51f06
BLAKE2b-256 5d945d9d3a0e1cef9d0c2f427b15fe3951f587de87beaad9cfe16590d43c2812

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1aa18639109b765a5b7e6f8ca3ff392f6b2d9aae36c89354470ace8c327f203d
MD5 c708df0dd05e8ee7db2e4b2079603889
BLAKE2b-256 75d34215fdb12d28b7c4ff553081d3571e585f688659f56c5b895e5328dd8a34

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d9a5c963d71eb4cbfcf5266acb50e6b4f65591aa5e189f1d771b8cfc23668241
MD5 13e2a8b66afa3a8b894fee061b8a35c8
BLAKE2b-256 c6a389cb054b8c8ac4d2270689375514f95fe76e2c5700266e8ad29e5a7a9788

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9e08279f17a0cbb4b2f4cf9605b7d56288f2ef5eabc1d77670e4dcf165ac5f5d
MD5 2b05db1ae032f0418f9035c9edf24187
BLAKE2b-256 19fc3c3a031dfbe045a487b706f7f7bb440250b6640b75c1eb264f1ab240fe57

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c71f6ab0db40175c398771c4ab8ccca84848981f051a4581636f0fec3ab3acd
MD5 05d15830a7200ab72c8211a6c45e79c8
BLAKE2b-256 d40a6faeb25eeb5cd8de87a39431fb394431eb7ac8651f87cf4fe8af32d1ae0c

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a4e8c495be3b4ec48d7b9ebb0d52841748df128606b416555812c91183b3507d
MD5 aca7ed3505733862e2beb848a63dd1ef
BLAKE2b-256 eb3e11cb91e55c1a3062f2cabd30d143f3b8f8dc1acf3d8cf35b776e9466cc95

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6e0047b68ededd305ac6f5628c814a52c06113eba79f4822d7d48803fe7de233
MD5 7e52e8f314aeaa60759086c53fad7f70
BLAKE2b-256 810d8be6e57358a6ff39398bf2f9ec9ceb3c9812e6e79743e927f9a153b10ce4

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f7e117e48bffc29f3d1d3bae5fbec3d16cdf6d6b370726a3c8bcc6329ccc7a7d
MD5 4369e2a035a102db330fa41a70533fc0
BLAKE2b-256 83b505d0c6aa34d512514d8d6b5877eeaa03f8e195ed332f64184b8835f66ddd

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2bb5623b43a2fc7e43f896979cf20e448893c8a73036986ca713911dacced7f
MD5 2ec4133386b06a58a9b59a540cdeb2b3
BLAKE2b-256 1679a73a7ad4abebcafef43b0da96b4b60f2adab049577de660cbb53ccf684ef

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c624efe066576f7258eedb2c166d173a3825ebcb3e8f90c3e811e41911fe813
MD5 abc96d0537e39910b5c9378e60b98e13
BLAKE2b-256 855e1c2266598502b413c17353e588ab51453b24bf1dc37a9579df71ad8e44b7

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 24123e8fff8ddc195b9b2ea516c80c9794038d2928d01d085381ec31d6f4df46
MD5 b5b895acaa98fa33e901fe1ca6d0d75a
BLAKE2b-256 49796cacb6d37ece2c7e20e0c6ae71889ced1d5bd6449470fb1c4633995c050e

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aa5b9970051d3aaff3be7cf2c9183145c09836d653611f5c9219750938d83bd0
MD5 9ad08df245ba93787acd45f82fc2e443
BLAKE2b-256 5e0a35963fac23967c6844a3f65eb9f2fba2a36a066b1adc3315f42aab71e6d8

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 759baa31bdff603005368712a3ee963b2c9034ea0c4a160887db72dde0a60a56
MD5 6fda3fdf73ae0376864ba3fc3821daac
BLAKE2b-256 54e9ab00f700679428b688a61a01ad2c5aebbd0e75e6f1a1adb00b068538f244

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a29a7f10730c487ca32f4cb313ca66c37a44c652be7e9207a6746fa6dbbc491
MD5 ea80d1352a09ebfe05a33ff0c7d6bd52
BLAKE2b-256 81b48039567bfec9d12a7e0fc082829aa3a9fd991ac537b98a0c2c5a33aa2ec5

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c214d34bd85e37c0c2667043f93f43da0f2690f408cdba3f3ee1885ce3e4501e
MD5 71a3d985796fff37f3e1e297c8b1f5cb
BLAKE2b-256 f2cdf40b7892b09b6fb40ecf435bcd8e82bfc176892aef5cab2f7da0fd6bac97

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f1aef59155edfa51a2a1fd0415b55f072beb2f1b2900315f6a2aa93bbd1e5324
MD5 4f35809ba1310b28ad34183d9bc22566
BLAKE2b-256 c06daac1f2625d02ff8b81e376a236648a7b57b5afa78908e91262e2d5cd1384

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 902402b55d1c96ddfbc56fdb84d1730f4da7bec2ffdd3e4f05204573bb44a1b7
MD5 a9a87069b0503028da13ba60b3546842
BLAKE2b-256 8572986314329afc90d3a8cb158949f65f5d74467e021cb4a59a26275d98230f

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f197f050ffd55c71c29a3fde7afa36108bb4e7d29899b0133dc701c62b9f81e0
MD5 48dccc8087e0c985911238d801f41619
BLAKE2b-256 5571fb201316ad4be8174a1d8e561e086c6be9f4e8975896a186425e59eeaeac

See more details on using hashes here.

File details

Details for the file knncolle-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for knncolle-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9512a55f6556b65edaa40a3e1dfbab0cf0cd66351050e1514a709ce56295c4db
MD5 c6336c950e247f448bf173c0210f7942
BLAKE2b-256 b8846002f30cfc1cabbc1202625465deee20d5413767de3ae8c4a0651dd9e3d5

See more details on using hashes here.

Supported by

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