tisimst / pyDOE

Design of experiments for Python
BSD 3-Clause "New" or "Revised" License
263 stars 114 forks source link

python3 error #23

Open andreacortis opened 5 years ago

andreacortis commented 5 years ago

(doe) LC25423:Envs corti938$ ipython Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 12:04:33) Type 'copyright', 'credits' or 'license' for more information IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from pyDOE import *

In [2]: import pyDOE

In [3]: pyDOE.version
Out[3]: '0.3.8'

In [4]: fullfact([2, 3])

TypeError Traceback (most recent call last)

in ----> 1 fullfact([2, 3]) ~/my_codes/Envs/doe/lib/python3.6/site-packages/pyDOE/doe_factorial.py in fullfact(levels) 76 for j in range(levels[i]): 77 lvl += [j]*level_repeat ---> 78 rng = lvl*range_repeat 79 level_repeat *= levels[i] 80 H[:, i] = rng TypeError: can't multiply sequence by non-int of type 'numpy.float64'
StefanNa commented 5 years ago

I have the same issue

Can we get the version of numpy and scipy that were used for testing the package?

Also what python 3 version?

bgoodman44 commented 5 years ago

Hopefully this isn't dead...but heres my versions

numpy: 1.15.1 python: 3.5 scipy: 1.2.0

cruoti commented 5 years ago

I too have the same issue (using python 3.7.2, pyDOE 0.3.8). This led me to do some digging.

The error stems from the fact that Python 3.x updated the behavior of division. Dividing two ints now produces a float.

PEP 238: https://www.python.org/dev/peps/pep-0238/ Stack Overflow: https://stackoverflow.com/q/1282945

# python 3.7.2
>>> 1/2
0.5

If you want to continue using floor division in python 3.x then you use the // operator.

# python 3.7.2
>>> 1//2
0

The nice thing is that the // operator also works in at least python 2.7 (I haven't tested any other 2.x version).

It'll work if you change doe_factorial.py line 74 to use the // operator.

    range_repeat = np.prod(levels)
    for i in range(n):
        range_repeat //= levels[i]    # updated from range_repeat /= levels[i]

It looks like #8 was created to fix the same problem that manifested itself slightly differently. The solution was merged into master with PR #20. However, as #19 calls out, the update has not been released to PyPI (nor has the version been incremented in __init__.py).

pyDOE2 was forked from this repo to release this fix and others to PyPI. Install using: pip install pyDOE2. I'm doing my import in the following way so I didn't have to change any of the rest of my code:

import pyDOE2 as pyDOE

@tisimst What's the plan on releasing this fix to PyPI? I saw your note on #17 saying that you've been too busy to make updates. I can understand that. Do you recommend moving to pyDOE2 permanently? Like the comment in #17, have you given thought to allowing other contributors on the repo? Thanks for the great package thus far, it's been great for all of my work in 2.7.

maraujo commented 5 years ago

From @cruti comments and because I'm using python 3. The current solution is to uninstall pyDOE and install pyDOE2.

rsyanting commented 2 years ago

From @Cruti comments and because I'm using python 3. The current solution is to uninstall pyDOE and install pyDOE2.

hi my dear friend,I use pyDoe2 and everything be fine. Thank a lot !