إعادة ترتيب عناصر المصفوفة لتعكس مجموعات الصفوف والأعمدة في لغة بايثون الساذجة

StackOverflow https://stackoverflow.com/questions/2455761

سؤال

أنا أبحث عن طريقة لإجراء التجميع بشكل منفصل على صفوف المصفوفة وبدلاً من إعادة ترتيب البيانات في المصفوفة على أعمدتها لتعكس التجميع وتجميعها معًا.يمكن حل مشكلة التجميع بسهولة، وكذلك إنشاء مخطط الأشجار (على سبيل المثال في هذه المدونة أو في "برمجة الذكاء الجماعي").ومع ذلك، فإن كيفية إعادة ترتيب البيانات لا تزال غير واضحة بالنسبة لي.

في النهاية، أنا أبحث عن طريقة لإنشاء رسوم بيانية مشابهة لتلك الموجودة أدناه باستخدام لغة Python الساذجة (مع أي مكتبة "قياسية" مثل numpy وmatplotlib وما إلى ذلك، ولكن بدون باستخدام ر أو غيرها من الأدوات الخارجية).

dendogram
(مصدر: warwick.ac.uk)

توضيحات

لقد سئلت عما أقصده بإعادة الترتيب.عندما تقوم بتجميع البيانات في مصفوفة أولاً حسب صفوف المصفوفة، ثم حسب أعمدتها، يمكن تحديد كل خلية مصفوفة من خلال الموضع في المخططين الشجريين.إذا قمت بإعادة ترتيب صفوف وأعمدة المصفوفة الأصلية بحيث تصبح العناصر القريبة من بعضها البعض في المخططات الشجرية قريبة من بعضها البعض في المصفوفة، ثم قمت بإنشاء خريطة حرارية، فقد يصبح تجميع البيانات واضحًا للمشاهد (كما في الشكل أعلاه)

هل كانت مفيدة؟

المحلول

انظر بلدي الإجابة الأخيرة, ، تم نسخه جزئيًا أدناه، إلى هذا السؤال ذو الصلة.

import scipy
import pylab
import scipy.cluster.hierarchy as sch

# Generate features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

# Compute and plot dendrogram.
fig = pylab.figure()
axdendro = fig.add_axes([0.09,0.1,0.2,0.8])
Y = sch.linkage(D, method='centroid')
Z = sch.dendrogram(Y, orientation='right')
axdendro.set_xticks([])
axdendro.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.8])
index = Z['leaves']
D = D[index,:]
D = D[:,index]
im = axmatrix.matshow(D, aspect='auto', origin='lower')
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.8])
pylab.colorbar(im, cax=axcolor)

# Display and save figure.
fig.show()
fig.savefig('dendrogram.png')

Dendrogram and distance matrix
(مصدر: stevetjoa.com)

نصائح أخرى

لست متأكدًا من الفهم الكامل، ولكن يبدو أنك تحاول إعادة فهرسة كل محور من محاور المصفوفة بناءً على أنواع مؤشرات مخطط الأشجار.أعتقد أن هذا يفترض وجود بعض المنطق المقارن في كل تحديد فرعي.إذا كان هذا هو الحال فهل سيعمل هذا (؟):

>>> x_idxs = [(0,1,0,0),(0,1,1,1),(0,1,1),(0,0,1),(1,1,1,1),(0,0,0,0)]
>>> y_idxs = [(1,1),(0,1),(1,0),(0,0)]
>>> a = np.random.random((len(x_idxs),len(y_idxs)))
>>> x_idxs2, xi = zip(*sorted(zip(x_idxs,range(len(x_idxs)))))
>>> y_idxs2, yi = zip(*sorted(zip(y_idxs,range(len(y_idxs)))))
>>> a2 = a[xi,:][:,yi]

x_idxs و y_idxs هي مؤشرات dendrogram. a هي المصفوفة غير المصنفة. xi و yi هي مؤشرات مجموعة الصف/العمود الجديدة الخاصة بك. a2 هي المصفوفة التي تم فرزها بينما x_idxs2 و y_idxs2 هي مؤشرات dendrogram الجديدة المصنفة.يفترض هذا أنه عندما تم إنشاء مخطط الأشجار، فإن أ 0 يكون العمود/الصف الفرعي دائمًا أكبر/أصغر نسبيًا من a 1 فرع.

إذا لم تكن y_idxs وx_idxs عبارة عن قوائم ولكنها عبارة عن صفائف numpy، فيمكنك استخدامها np.argsort بطريقة مماثلة.

أعلم أن هذا متأخر جدًا في اللعبة، لكنني قمت بإنشاء كائن تخطيطي بناءً على الكود الموجود في المنشور الموجود على هذه الصفحة.إنه مسجل على نقطة، لذا لتثبيته عليك فقط الاتصال

pip install pydendroheatmap

تحقق من صفحة جيثب المشروع هنا: https://github.com/themantalope/pydendroheatmap

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top