Skip to main content

Remap and renumber numpy arrays.

Project description

[![Build Status](https://travis-ci.org/seung-lab/fastremap.svg?branch=master)](https://travis-ci.org/seung-lab/fastremap) [![PyPI version](https://badge.fury.io/py/fastremap.svg)](https://badge.fury.io/py/fastremap)

# fastremap

Renumber and relabel Numpy arrays at C++ speed and physically convert Numpy arrays between C and Fortran order using an in-place transposition.

## `pip` Installation

```bash
pip install fastremap
```

*If not, a C++ compiler is required.*

```bash
pip install numpy
pip install fastremap --no-binary :all:
```

## Manual Installation

*A C++ compiler is required.*

```bash
sudo apt-get install g++ python3-dev
mkvirtualenv -p python3 fastremap
pip install numpy

# Choose one:
python setup.py develop
python setup.py install
```

## The Problem of Remapping

Python loops are slow, so Numpy is often used to perform remapping on large arrays (hundreds of megabytes or gigabytes). In order to efficiently remap an array in Numpy you need a key-value array where the index is the key and the value is the contents of that index.

```python
import numpy as np

original = np.array([ 1, 3, 5, 5, 10 ])
remap = np.array([ 0, -5, 0, 6, 0, 0, 2, 0, 0, 0, -100 ])
# Keys: 0 1 2 3 4 5 6 7 8 9 10

remapped = remap[ original ]
>>> [ -5, 6, 2, 2, -100 ]
```

If there are 32 or 64 bit labels in the array, this becomes impractical as the size of the array can grow larger than RAM. Therefore, it would be helpful to be able to perform this mapping using a C speed loop. Numba can be used for this in some circumstances. However, this library provides an alternative.

```python
import numpy as np
import fastremap

mappings = {
1: 100,
2: 200,
-3: 7,
}

arr = np.array([5, 1, 2, -5, -3, 10, 6])
# Custom remapping of -3, 5, and 6 leaving the rest alone
arr = fastremap.remap(arr, mappings, preserve_missing_labels=True)
# result: [ 5, 100, 200, -5, 7, 10, 6 ]
```

## The Problem of Renumbering

Sometimes a 64-bit array contains values that could be represented by an 8-bit array. However, similarly to the remapping problem, Python loops can be too slow to do this. Numpy doesn't provide a convenient way to do it either. Therefore this library provides an alternative solution.

```python
import fastremap
import numpy as np

arr = np.array([ 283732875, 439238823, 283732875, 182812404, 0 ], dtype=np.int64)

arr, remapping = fastremap.renumber(arr, preserve_zero=True) # Returns uint8 array
>>> arr = [ 1, 2, 1, 3, 0 ]
>>> remapping = { 0: 0, 283732875: 1, 439238823: 2, 182812404: 3 }

arr, remapping = fastremap.renumber(arr, preserve_zero=False) # Returns uint8 array
>>> arr = [ 1, 2, 1, 3, 4 ]
>>> remapping = { 0: 4, 283732875: 1, 439238823: 2, 182812404: 3 }

```

## The Problem of In-Place Transposition

When transitioning between different media, e.g. CPU to GPU, CPU to Network, CPU to disk, it's often necessary to physically transpose multi-dimensional arrays to reformat as C or Fortran order. Tranposing matrices is also a common action in linear algebra, but often you can get away with just changing the strides.

An out-of-place transposition is easy to write, and often faster, but it will spike peak memory consumption. This library grants the user the option of performing an in-place transposition which trades CPU time for peak memory usage.

- **fastremap.asfortranarray:** Same as np.asfortranarray but will perform the transposition in-place for 1, 2, 3, and 4D arrays. 2D and 3D square matrices are faster to process than with Numpy.
- **fastremap.ascontiguousarray:** Same as np.ascontiguousarray but will perform the transposition in-place for 1, 2, 3, and 4D arrays. 2D and 3D square matrices are faster to process than with Numpy.

```python
import fastremap
import numpy as np

arr = np.ones((512,512,512), dtype=np.float32)
arr = fastremap.asfortranarray(x)

arr = np.ones((512,512,512), dtype=np.float32, order='F')
arr = fastremap.ascontiguousarray(x)
```

## All Available Functions:
- **renumber:** Relabel array from 1 to N which can often use smaller datatypes.
- **remap:** Custom relabeling of values in an array from a dictionary.
- **remap_from_array:** Same as remap, but the map is an array where the key is the array index and the value is the value.
- **remap_from_array_kv:** Same as remap, but the map consists of two equal sized arrays, the first containing keys, the second containing values.
- **asfortranarray:** Perform an in-place matrix transposition for square and cubic arrays, standard numpy algorithm otherwise.
- **ascontiguousarray:** Perform an in-place matrix transposition for square and cubic arrays, standard numpy algorithm otherwise.

## C++ Usage

The in-place matrix transposition is implemented in ipt.hpp. If you're working in C++, you can also use it directly like so:

```cpp
#include "ipt.hpp"

int main() {

int sx = 128;
int sy = 124;
int sz = 103;
int sw = 3;

auto* arr = ....;

// All primitive number types supported
// The array will be modified in place,
// so these functions are void type.
ipt::ipt<int>(arr, sx, sy); // 2D
ipt::ipt<float>(arr, sx, sy, sz); // 3D
ipt::ipt<double>(arr, sx, sy, sz, sw); // 4D

return 0;
}
```

--
Made with <3

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

fastremap-1.2.2.tar.gz (217.9 kB view details)

Uploaded Source

Built Distributions

fastremap-1.2.2-cp37-cp37m-manylinux1_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.7m

fastremap-1.2.2-cp36-cp36m-manylinux1_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.6m

fastremap-1.2.2-cp35-cp35m-manylinux1_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.5m

fastremap-1.2.2-cp27-cp27m-manylinux1_x86_64.whl (1.2 MB view details)

Uploaded CPython 2.7m

File details

Details for the file fastremap-1.2.2.tar.gz.

File metadata

  • Download URL: fastremap-1.2.2.tar.gz
  • Upload date:
  • Size: 217.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for fastremap-1.2.2.tar.gz
Algorithm Hash digest
SHA256 e89cc1533aecbd9238365cfac28bdeb79553208c9b70a0ab580eca0c441ea206
MD5 b1d3fa8da91b6fcfa0e6b3e30b516ef1
BLAKE2b-256 03b21bd82253ed103d40e991a6b16225d264abf23b9c4d2667a8e36f4906de30

See more details on using hashes here.

File details

Details for the file fastremap-1.2.2-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: fastremap-1.2.2-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for fastremap-1.2.2-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8f3eee6f8f6ac6e9e0fc747b241467080f52ae9395f2404e8662107f5cb3d402
MD5 f3dc06b96d60e7ee4f79755aee0fd58d
BLAKE2b-256 8e71a65ce4bd1ace2e53b0ad00755c0d2f86f3e4cf67f9b088419f494304584d

See more details on using hashes here.

File details

Details for the file fastremap-1.2.2-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: fastremap-1.2.2-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for fastremap-1.2.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c76fa16c7c50a2aed5f7bd84e1beb84382aed029c9019f7f14d57aa194b9e844
MD5 f283d9b9e5bc49910ad03b9df726c8f4
BLAKE2b-256 ae4a665612eabd22c06716db1fced7e95a87af64efe098dc72cc5d487e46e95e

See more details on using hashes here.

File details

Details for the file fastremap-1.2.2-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: fastremap-1.2.2-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for fastremap-1.2.2-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0f56248e684e57ea7aa9854ae284f0f94bbb30d72590d719ea2ceef39debbeee
MD5 5ef380d9c10a7d0026de86dd3f0c783f
BLAKE2b-256 2cda3d945143c853e14f7f9040db56cc1a909224d40801170f31bf386b8686cd

See more details on using hashes here.

File details

Details for the file fastremap-1.2.2-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

  • Download URL: fastremap-1.2.2-cp27-cp27m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 2.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for fastremap-1.2.2-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2db4f8699c50c6a40839c43209e664b49a0f9c719af9fa3d1e48d274753e348f
MD5 450f67b7104cecda5c1c01a1c5584c2f
BLAKE2b-256 b5e64f3cc681681776e9fe08ef7712b90a1dc3c740d080b95c83d9db8ac924f7

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