Discussion:
[Numpy-discussion] Does numpy.bincount support numpy.float128 type weights?
Wei, Huayi
2016-11-30 21:54:16 UTC
Permalink
Hi, There,

Here is a sample code using `numpy.bincount`

import numpy as np
a = np.array([1.0, 2.0, 3.0], dtype=np.float128)
b = np.array([1, 2, 0], dtype=np.int)
c = np.bincount(b, weights=a)

If run it, I get the following error report:

----> 1 c = np.bincount(b, weights=a)
TypeError: Cannot cast array data from dtype('float128') to
dtype('float64') according to the rule 'safe'

Is it a bug of `np.bincount`? Does there exist any similar function
which I can use to do the similar thing with numpy.float128 type weights?

Best

Huayi
Nathan Goldbaum
2016-11-30 21:59:03 UTC
Permalink
I think this is a deficiency in the current implementation of bincount,
which always casts the weights to float64. This WIP pull request should
probably fix it:

https://github.com/numpy/numpy/pull/7464
Post by Wei, Huayi
Hi, There,
Here is a sample code using `numpy.bincount`
import numpy as np
a = np.array([1.0, 2.0, 3.0], dtype=np.float128)
b = np.array([1, 2, 0], dtype=np.int)
c = np.bincount(b, weights=a)
----> 1 c = np.bincount(b, weights=a)
TypeError: Cannot cast array data from dtype('float128') to
dtype('float64') according to the rule 'safe'
Is it a bug of `np.bincount`? Does there exist any similar function which
I can use to do the similar thing with numpy.float128 type weights?
Best
Huayi
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
Julian Taylor
2016-11-30 22:16:29 UTC
Permalink
Also note that float128 is rarely what you want.
It is not a quad precision value, it maps to C long double which is 80
bit on x86 and less on stuff like arm.
Post by Nathan Goldbaum
I think this is a deficiency in the current implementation of bincount,
which always casts the weights to float64. This WIP pull request should
https://github.com/numpy/numpy/pull/7464
Hi, There,
Here is a sample code using `numpy.bincount`
import numpy as np
a = np.array([1.0, 2.0, 3.0], dtype=np.float128)
b = np.array([1, 2, 0], dtype=np.int <http://np.int>)
c = np.bincount(b, weights=a)
----> 1 c = np.bincount(b, weights=a)
TypeError: Cannot cast array data from dtype('float128') to
dtype('float64') according to the rule 'safe'
Is it a bug of `np.bincount`? Does there exist any similar function
which I can use to do the similar thing with numpy.float128 type weights?
Best
Huayi
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
<https://mail.scipy.org/mailman/listinfo/numpy-discussion>
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
Sebastian Berg
2016-11-30 22:22:45 UTC
Permalink
Fist off, a word of caution. float128 depends on your system and maps
to whatever longdouble is (IIRC) or may not even exist. So I hope you
don't expect IEEE 128 bit floats, if you are unsure, maybe check
`np.finfo`.

If speed does not matter
```
res = np.zeros(np.max(b), dtype=np.longdouble)
np.add.at(res, b, a)
```
will work, but do not expect it to be fast.

- Sebastian
Post by Wei, Huayi
Hi, There,
Here is a sample code using `numpy.bincount`
     import numpy as np
     a = np.array([1.0, 2.0, 3.0], dtype=np.float128)
     b = np.array([1, 2, 0], dtype=np.int)
     c = np.bincount(b, weights=a)
     ----> 1 c = np.bincount(b, weights=a)
     TypeError: Cannot cast array data from dtype('float128') to 
dtype('float64') according to the rule 'safe'
Is it a bug of `np.bincount`? Does there exist any similar function 
which I can use to do the similar thing with numpy.float128 type weights?
Best
Huayi
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
Loading...