0
特定の配列内の異なる配列にはない要素を取得する、より優れた方法です。これは私が持っているものです。
idata = [np.column_stack(data[k]) for k in range(len(data)) if data[k] not in final]
idata = np.vstack(idata)
私の興味はパフォーマンスです。私data
は(X、Y、Z)サイズの配列(×3 7000)であると私gdata
は、私が上で働いている前文
(11000×2)
の(X、Y)の配列であります各オクタントの点(+)に最も近い点(+)のn個(例えば8個)を見つける。これは私のポイント(+)がわずか64(8分の1)に減少することを意味します。そして、それぞれgdata
については、data
に見つからない要素を保存します。
import tkinter as tk
from tkinter import filedialog
import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from collections import defaultdict
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
data = pd.read_excel(file_path)
data = np.array(data, dtype=np.float)
nrow, cols = data.shape
file_path1 = filedialog.askopenfilename()
gdata = pd.read_excel(file_path1)
gdata = np.array(gdata, dtype=np.float)
gnrow, gcols = gdata.shape
N=8
delta = gdata - data[:,:2]
angles = np.arctan2(delta[:,1], delta[:,0])
bins = np.linspace(-np.pi, np.pi, 9)
bins[-1] = np.inf # handle edge case
octantsort = []
for j in range(gnrow):
delta = gdata[j, ::] - data[:, :2]
angles = np.arctan2(delta[:, 1], delta[:, 0])
octantsort = []
for i in range(8):
data_i = data[(bins[i] <= angles) & (angles < bins[i+1])]
if data_i.size > 0:
dist_order = np.argsort(cdist(data_i[:, :2], gdata[j, ::][np.newaxis]), axis=0)
if dist_order.size < npoint_per_octant+1:
[octantsort.append(data_i[dist_order[:npoint_per_octant][j]]) for j in range(dist_order.size)]
else:
[octantsort.append(data_i[dist_order[:npoint_per_octant][j]]) for j in range(npoint_per_octant)]
final = np.vstack(octantsort)
idata = [np.column_stack(data[k]) for k in range(len(data)) if data[k] not in final]
idata = np.vstack(idata)
は、コードの最後の2行で、パフォーマンスを向上させるかこれを行うための効率的かつ神託方法はありますか?
例/シミュレートされたデータ、典型的な/最大データセットのサイズは '最終作ってみる、より良いパフォーマンスを得るためとして、ファイルの読み取りコード – f5r5e5d
を示す以上に役立つだろう'' set'。セットはO(1)時間で検索できます。 – rlbond