Ich habe zwei Numpy-Arrays x und y gleicher Länge und versuche, eine quadratische Matrix A zu erstellen, sodass der (i,j)-Eintrag der Matrix eine 1 enthält, wenn eine bestimmte Beziehung zwischen x, x[j], y und y[j] und ansonsten eine 0.
Die aktuelle Methode, die ich dafür habe, beginnt mit A als Nullmatrix (von Abmessungen len(x) by len(x)) und dann eine doppelte for-Schleife verwenden, um alle i und alle j>i abzudecken (diese Matrix ist in der Diagonale symmetrisch). Allerdings dauert die Ausführung sehr, sehr lange – die Länge von x beträgt etwa 15.000. Die überwiegende Mehrheit der Einträge in A wird 0 sein, daher scheint dies eine recht ineffiziente Vorgehensweise zu sein. Ich dachte, dass potenziell maskierte Arrays verwendet werden könnten, habe aber nicht herausgefunden, wie ich sie in dieser Situation verwenden soll. Für jede Hilfe wäre ich sehr dankbar!
Hier ist der Code, den ich derzeit habe: df ist ein Datenrahmen, in dem eine Spalte Nachnamen und eine andere ein Datum enthält.
import pandas as pd
from datetime import datetime
date_format = '%Y-%m-%d %H:%M:%S'
df1 = pd.DataFrame([['Smith', '2024-12-16 12:00:00'], ['Smith', '2024-12-16 13:00:00'], ['Doe', '2024-12-16 12:01:00'], ['Doe', '2024-12-16 12:04:00']])# -*- coding: utf-8 -*-
df1.columns = ['Surname', 'Date']
df1['Date'] = df1.apply(lambda r : datetime.strptime(r['Date'], date_format),1)
x1 = df1['Surname'].to_numpy()
y1 = df1['Date'].to_numpy()
A1 = scipy.sparse.lil_matrix((len(df1.index), len(df1.index))).todense()
for i in range(len(x1)):
for j in range(i, len(x1)):
A1[i,j] = int((x1 == x1[j]) & (abs(np.timedelta64(y1-y1[j], 'm')) < np.timedelta64(5, 'm')))
So erstellen Sie effizient eine große Matrix aus Einsen und Nullen ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post