Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RuntimeWarning: invalid value encountered in true_divide #17

Open
ghost opened this issue Apr 14, 2022 · 3 comments
Open

RuntimeWarning: invalid value encountered in true_divide #17

ghost opened this issue Apr 14, 2022 · 3 comments

Comments

@ghost
Copy link

ghost commented Apr 14, 2022

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 ?

@ghost
Copy link
Author

ghost commented Apr 14, 2022

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 :)

@hbldh
Copy link
Owner

hbldh commented Apr 14, 2022

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.

@hbldh
Copy link
Owner

hbldh commented Apr 14, 2022

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant