scipy.cluster.hierarchy中链接函数的用法

时间:2018-03-31 13:37:35

标签: python numpy scipy cluster-analysis

我正在尝试将层次结构群集应用于图像的像素值。这是为了分配图像的不同区域并提取具有相似颜色的片段。问题的区域是仅按近颜色分割图像,按形状分割。    我想尝试(假设图像加载为numpy数组形状(256,256,3),由于版权问题无法共享图片:

from scipy.cluster.hierarchy import dendrogram, linkage
ppp=img.reshape(img.shape[0]*img.shape[1],img.shape[2])
Z = linkage(ppp, method = 'ward')
dendrogram(Z,leaf_rotation=90.,    leaf_font_size=8.,)

这是错误的:

MemoryError                               Traceback (most recent call last)
<ipython-input-87-39453b2f2da1> in <module>()
     14     ppp=img.reshape(img.shape[0]*img.shape[1],img.shape[2])
---> 15     Z = linkage(ppp, method = 'ward')
     16     dendrogram(Z,leaf_rotation=90.,    leaf_font_size=8.,)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\cluster\hierarchy.py in linkage(y, method, metric, optimal_ordering)
    706                          'matrix looks suspiciously like an uncondensed '
    707                          'distance matrix')
--> 708         y = distance.pdist(y, metric)
    709     else:
    710         raise ValueError("`y` must be 1 or 2 dimensional.")

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\spatial\distance.py in pdist(X, metric, *args, **kwargs)
   1650     out = kwargs.pop("out", None)
   1651     if out is None:
-> 1652         dm = np.empty((m * (m - 1)) // 2, dtype=np.double)
   1653     else:
   1654         if out.shape != (m * (m - 1) // 2,):
你能帮帮忙吗?

1 个答案:

答案 0 :(得分:1)

ppp具有形状(65536,3),因此该错误消息中的m为65536.在内部,linkage创建一个大小为m*(m-1)//2的浮点值数组保持所有成对距离。在您的情况下,这是2147450880元素。每个浮点元素需要8个字节,因此数组的总大小为17179607040字节。那超过17千兆字节。大概你没有足够的内存来分配这样的数组。