Skip to content

Commit 0cc8a72

Browse files
committed
Fall back to memory efficient replace_values in relabel
1 parent bc04235 commit 0cc8a72

File tree

7 files changed

+63
-16
lines changed

7 files changed

+63
-16
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,11 @@
44
*.ipynb
55
*.db
66
*.py[cod]
7+
*.c
8+
*.cpp
9+
*.so
10+
lsd.egg-info
11+
build
712
docker/lsd
813
docker/requirements.txt
14+
docker/setup.py

Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
default:
2-
pip install .
3-
-rm -rf dist build gunpowder.egg-info
2+
python setup.py install
43

54
.PHONY: install-full
65
install-full:

docker/Dockerfile

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ LABEL maintainer [email protected]
66
RUN apt-get update && apt-get install -y --no-install-recommends \
77
wget \
88
git \
9+
python-numpy \
910
libmlpack-dev && \
1011
rm -rf /var/lib/apt/lists/*
1112

@@ -116,5 +117,7 @@ ENV PYTHONPATH ${DAISY_ROOT}:$PYTHONPATH
116117
# Makefile ensures that)
117118
ADD lsd /src/lsd/lsd
118119
ADD requirements.txt /src/lsd/requirements.txt
120+
ADD setup.py /src/lsd/setup.py
119121
WORKDIR /src/lsd
122+
RUN python setup.py build_ext --inplace
120123
ENV PYTHONPATH /src/lsd:$PYTHONPATH

docker/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
TAG="funkey/lsd:v0.3"
1+
TAG="funkey/lsd:v0.4"
22

33
.PHONY: default push
44
default:
55
#-docker rmi -f $(TAG)
66
-rm -rf lsd
77
cp -r ../lsd .
88
cp ../requirements.txt .
9+
cp ../setup.py .
910
docker build -t $(TAG) .
1011

1112
push: default

lsd/labels.py

+18-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1+
from __future__ import absolute_import
2+
from .replace_values import replace_values as cpp_replace_values
13
import numpy as np
24

35
def replace_values(array, old_values, new_values):
46

5-
values_map = np.arange(old_values.max() + 1, dtype=new_values.dtype)
6-
values_map[old_values] = new_values
7+
max_old_value = old_values.max()
78

8-
return values_map[array]
9+
if max_old_value < 1024**3:
10+
11+
values_map = np.arange(old_values.max() + 1, dtype=new_values.dtype)
12+
values_map[old_values] = new_values
13+
14+
return values_map[array]
15+
16+
else:
17+
18+
values_map = {
19+
old_value: new_value
20+
for old_value, new_value in zip(old_values, new_values)
21+
}
22+
23+
return cpp_replace_values(array, values_map)
924

1025
def relabel(array, return_backwards_map=False):
1126
'''Relabel array, such that IDs are consecutive. Excludes 0.'''

lsd/replace_values.pyx

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from libcpp.map cimport map
2+
cimport cython
3+
import logging
4+
import numpy as np
5+
cimport numpy as np
6+
7+
@cython.boundscheck(False)
8+
@cython.wraparound(False)
9+
def replace_values(array_np, values_map):
10+
11+
cdef Py_ssize_t i = 0
12+
cdef Py_ssize_t n = array_np.size()
13+
14+
replaced_np = np.zeros_like(array_np)
15+
cdef np.npy_uint64[:] array = array_np
16+
cdef np.npy_uint64[:] replaced = replaced_np
17+
cdef map[np.npy_uint64, np.npy_uint64] cmap = values_map
18+
19+
for i in range(n):
20+
replaced[i] = cmap[array[i]]
21+
22+
return replaced_np

setup.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from setuptools import setup
2-
import subprocess
1+
from Cython.Distutils import build_ext
2+
from distutils.core import setup
3+
from distutils.extension import Extension
34

45
setup(
56
name='lsd',
@@ -13,12 +14,12 @@
1314
'lsd',
1415
'lsd.gp',
1516
],
16-
install_requires=[
17-
"numpy",
18-
"scipy",
19-
"h5py",
20-
"scikit-image",
21-
"requests",
22-
"gunpowder"
23-
]
17+
ext_modules=[
18+
Extension(
19+
'lsd.replace_values',
20+
sources=['lsd/replace_values.pyx'],
21+
extra_compile_args=['-O3'],
22+
language='c++')
23+
],
24+
cmdclass={'build_ext': build_ext}
2425
)

0 commit comments

Comments
 (0)