Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scipy Kmeans exits with TypeError

When running the code below, I'm getting a TypeError that says:

"File "_vq.pyx", line 342, in scipy.cluster._vq.update_cluster_means TypeError: type other than float or double not supported"

from PIL import Image
import scipy, scipy.misc, scipy.cluster

NUM_CLUSTERS = 5

im = Image.open('d:/temp/test.jpg')
ar = scipy.misc.fromimage(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2])
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
vecs, dist = scipy.cluster.vq.vq(ar, codes)
counts, bins = scipy.histogram(vecs, len(codes))

peak = codes[scipy.argmax(counts)]
print 'Most frequent color: %s (#%s)' % (peak, ''.join(chr(c) for c in peak).encode('hex'))

I have no idea how to fix this.

Update:

Full traceback:

Traceback (most recent call last): File "...\temp.py", line 110, in <module> codes, dist = scipy.cluster.vq.kmeans2(ar, NUM_CLUSTERS) File "...\site-packages\scipy\cluster\vq.py", line 642, in kmeans2 new_code_book, has_members = _vq.update_cluster_means(data, label, nc) File "_vq.pyx", line 342, in scipy.cluster._vq.update_cluster_means TypeError: type other than float or double not supported

like image 204
Simon Steinberger Avatar asked Jul 13 '26 04:07

Simon Steinberger


1 Answers

Doing:

ar = ar.reshape(scipy.product(shape[:2]), shape[2])
print(ar.dtype)

you will see, that you call kmeans with data of type uint8.

As kmeans, in theory, is defined on a d-dimensional real vector, scipy also does not like it (as given in the error)!

So just do:

ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)

Casting like that is making my example run until the print, which also needs to be changed to reflect the given types.

like image 116
sascha Avatar answered Jul 15 '26 18:07

sascha