hbldh / pyefd

Python implementation of "Elliptic Fourier Features of a Closed Contour"

Home Page:http://pyefd.readthedocs.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

RuntimeWarning: invalid value encountered in true_divide

opened this issue · comments

Some specific contour leads to a warning and to NaN due to division by 0.

from pyefd import elliptic_fourier_descriptors
import numpy as np

contour = np.array([(0.0007365261134166801, 0.0008592751780890362), (0.0011385481809349507, 0.0005073326831297464), (0.0016015060818268534, 0.00024058327913523136), (0.002107608603590938, 6.927799610623175e-05), (0.002637406510141327, 0.0), (0.003170539965043462, 3.5411605355473164e-05), (0.0036865209486098838, 0.00017415196403836042), (0.0036865209486098838, 0.00017415196403836042), (0.003301593851628093, 0.0011941724608851567), (0.003301593851628093, 0.0011941724608851567), (0.0029920052614881287, 0.001110928245675824), (0.002672125188546981, 0.0010896812824625624), (0.002354246444616681, 0.0011312480801257685), (0.002050584931558297, 0.0012340312499438122), (0.0017728101910231553, 0.001394080892339833), (0.001531596950512193, 0.0016052463893156954), (0.0013362148995842427, 0.001859412769243729), (0.0011941724608850457, 0.0021468125606828314), (0.001110928245675491, 0.0024564011508226846), (0.0010896812824621183, 0.0027762812237640544), (0.0011312480801258795, 0.003094159967693799), (0.001234031249943368, 0.0033978214807524054), (0.001394080892340055, 0.003675596221287547), (0.0016052463893154734, 0.003916809461798509), (0.00185941276924384, 0.004112191512726571), (0.0021468125606826094, 0.004254233951425768), (0.0017618854637007075, 0.005274254448272675), (0.0012828858113027586, 0.005037517050440643), (0.0008592751780888142, 0.0047118802988938), (0.0005073326831298575, 0.004309858231375752), (0.0002405832791353424, 0.003846900330483627), (6.927799610623175e-05, 0.0033407978087195422), (0.0, 0.0028109999021695975), (3.5411605355584186e-05, 0.0022778664472672405), (0.0001741519640382494, 0.0017618854637008186), (0.00041088936187017033, 0.0012828858113032027), (0.0007365261134166801, 0.0008592751780890362)])
y = elliptic_fourier_descriptors(contour, order=3, normalize=False)
print(y)

will give the following output :

[[nan nan nan nan]
[nan nan nan nan]
[nan nan nan nan]]
/usr/local/lib/python3.7/dist-packages/pyefd.py:67: RuntimeWarning: invalid value encountered in true_divide
a = consts * np.sum((dxy[:, 0] / dt) * d_cos_phi, axis=1)
/usr/local/lib/python3.7/dist-packages/pyefd.py:68: RuntimeWarning: invalid value encountered in true_divide
b = consts * np.sum((dxy[:, 0] / dt) * d_sin_phi, axis=1)
/usr/local/lib/python3.7/dist-packages/pyefd.py:69: RuntimeWarning: invalid value encountered in true_divide
c = consts * np.sum((dxy[:, 1] / dt) * d_cos_phi, axis=1)
/usr/local/lib/python3.7/dist-packages/pyefd.py:70: RuntimeWarning: invalid value encountered in true_divide
d = consts * np.sum((dxy[:, 1] / dt) * d_sin_phi, axis=1)


Any idea how to fix this ?

Or how to work-around this ?

Aha, I found the root cause : it's because my contour contains duplicated coordinates.

It works if I filter out these duplicates :

from pyefd import elliptic_fourier_descriptors
import numpy as np

contour = np.array([(0.0007365261134166801, 0.0008592751780890362), (0.0011385481809349507, 0.0005073326831297464), (0.0016015060818268534, 0.00024058327913523136), (0.002107608603590938, 6.927799610623175e-05), (0.002637406510141327, 0.0), (0.003170539965043462, 3.5411605355473164e-05), (0.0036865209486098838, 0.00017415196403836042), (0.0036865209486098838, 0.00017415196403836042), (0.003301593851628093, 0.0011941724608851567), (0.003301593851628093, 0.0011941724608851567), (0.0029920052614881287, 0.001110928245675824), (0.002672125188546981, 0.0010896812824625624), (0.002354246444616681, 0.0011312480801257685), (0.002050584931558297, 0.0012340312499438122), (0.0017728101910231553, 0.001394080892339833), (0.001531596950512193, 0.0016052463893156954), (0.0013362148995842427, 0.001859412769243729), (0.0011941724608850457, 0.0021468125606828314), (0.001110928245675491, 0.0024564011508226846), (0.0010896812824621183, 0.0027762812237640544), (0.0011312480801258795, 0.003094159967693799), (0.001234031249943368, 0.0033978214807524054), (0.001394080892340055, 0.003675596221287547), (0.0016052463893154734, 0.003916809461798509), (0.00185941276924384, 0.004112191512726571), (0.0021468125606826094, 0.004254233951425768), (0.0017618854637007075, 0.005274254448272675), (0.0012828858113027586, 0.005037517050440643), (0.0008592751780888142, 0.0047118802988938), (0.0005073326831298575, 0.004309858231375752), (0.0002405832791353424, 0.003846900330483627), (6.927799610623175e-05, 0.0033407978087195422), (0.0, 0.0028109999021695975), (3.5411605355584186e-05, 0.0022778664472672405), (0.0001741519640382494, 0.0017618854637008186), (0.00041088936187017033, 0.0012828858113032027), (0.0007365261134166801, 0.0008592751780890362)])

# Remove duplicated coordinates
contour = np.array([contour[i] for i in range(len(contour)) if (i==0) or all(contour[i] != contour[i-1])])

y = elliptic_fourier_descriptors(contour, order=3, normalize=False)
print(y)

I'm not sure if the maintainers wants to include this cleaning code inside the library or not (I can open PR).

I'll keep the issue open until I get an answer :)

You have some duplicates among your coordinates, e.g.:

...
(0.0036865209486098838, 0.00017415196403836042), (0.0036865209486098838, 0.00017415196403836042),
...

Try to remove these and see if it improves anything.

Sorry, only saw the original post first...

I am not sure I want to include something like that in the pyefd code. It is better left to the user to deduplicate in my opinion.

A better error and some documentation about the probable cause of this error is however desireable.