Skip to main content

C++ based NumPy N-Dimesional patch extraction.

Project description

npy-cpp-patches

Read N-Dimensional patches from .npy files. This module is built using C++ and has Python3 bindings.

Data Specifications

  • Arrays must be saved in C-contiguous format, i.e. NOT Fortran-contiguous.
  • First dimension is indexed using in a non-contiguous manner. For example, this can be used to extract specific channels within a natural image.
  • Next dimensions are specified by a patch shape C++ vector or Python tuple. To extract patches of lower dimensionality than that of the data, set the corresponding dimensions to 1.

Python Usage

Install

pip install npy-patcher

Usage

from npy_patcher import PatcherDouble, PatcherFloat, PatcherInt, PatcherLong

# In this example lets say our data has shape (10, 90, 90), and is therefore 3D.
data_fpath = '/my/numpy/file.npy'
patcher = PatcherFloat() # Use PatcherFloat for np.float32 datatype
nc_index = [0, 1, 3, 5, 7] # Non-contiguous index
patch_shape = (30, 30) # Contiguous patch shape.
patch_stride = (30, 30) # Contiguous patch stride, set a smaller value than `patch_stride` for overlapping patches.
patch_num = 2
# The patch number indexes the patches (starting from 0). So in our example the index 2
# would be equivalent to data[nc_index, 0:30, 60:90]. The variable indexes the patches
# in C-contiguous manner, i.e. the last dimension has the smallest stride.
extra_padding = (0, 0) # Optionally apply extra padding, this is applied after initial padding calculation.
patch_num_offset = (0, 0) # Optionally provide an offset to extract patches after.

patch = patcher.get_patch(
    data_fpath, nc_index, patch_shape, patch_stride, patch_num, extra_padding, patch_num_offset
)
patch = patch.reshape((5, 30, 30)) # PatcherFloat returns a list, therefore we need to reshape.

C++ Usage

Below is an example written in C++, equivalent to the Python usage above.

// test.cpp
#include "src/patcher.hpp"
#include <vector>
#include <string>

int main() {
    std::string fpath = "data.npy";
    std::vector<size_t> nc_index {0, 1, 3, 5, 7};
    std::vector<size_t> patch_shape {30, 30};
    std::vector<size_t> patch_stride{30, 30};
    size_t patch_num = 2;
    std::vector<size_t> extra_padding = {0, 0};
    std::vector<size_t> patch_num_offset = {0, 0};

    Patcher<float> patcher;

    // Here the patch object is a contiguous 1D vector
    std::vector<float> patch = patcher.get_patch(
        fpath, nc_index, patch_shape, patch_stride, patch_num, extra_padding, patch_num_offset
    );

    return 0;
}

You can then build the package, for example using g++:

$ cd npy-cpp-patches/
$ g++ -std=c++17 -I ./ -g test.cpp src/npy_header.cpp src/pyparse.cpp -o test

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

npy-patcher-1.3.0.tar.gz (13.3 kB view hashes)

Uploaded Source

Built Distributions

npy_patcher-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (162.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (172.5 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (124.6 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

npy_patcher-1.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (164.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (171.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (124.6 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

npy_patcher-1.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (165.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (173.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (124.6 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

npy_patcher-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl (674.0 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

npy_patcher-1.3.0-cp310-cp310-musllinux_1_1_i686.whl (733.4 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

npy_patcher-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (178.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl (126.7 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

npy_patcher-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl (674.1 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

npy_patcher-1.3.0-cp39-cp39-musllinux_1_1_i686.whl (733.4 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

npy_patcher-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169.8 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (179.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl (126.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

npy_patcher-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl (674.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

npy_patcher-1.3.0-cp38-cp38-musllinux_1_1_i686.whl (732.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

npy_patcher-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169.6 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (178.9 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl (126.7 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

npy_patcher-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl (679.1 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

npy_patcher-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl (738.6 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

npy_patcher-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (164.7 kB view hashes)

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

npy_patcher-1.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (172.0 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl (124.4 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

npy_patcher-1.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl (678.8 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

npy_patcher-1.3.0-cp36-cp36m-musllinux_1_1_i686.whl (737.7 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

npy_patcher-1.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (164.6 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

npy_patcher-1.3.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl (171.9 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686

npy_patcher-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl (124.4 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

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