Импортируйте bathemetry через csv и визуализируйте большой объем воды

#python #pandas #numpy #data-visualization

#python #pandas #numpy #визуализация данных

Вопрос:

Надеюсь, я правильно это объясняю.

Я ищу способ лучше визуализировать подводный шум. Я не ищу решения (ну, может быть, я), но меня больше интересует, каким было бы идеальное начало, учитывая, что скорость важна (так что в значительной степени ваше мнение о Q1-Q3).

Я пытаюсь выполнить вычисления и визуализации объема воды. Для этого я хочу в основном импортировать батиметрию (csv, содержащую x, y, z) значительной площади (скажем, 50 км x 50 км).

Q1: использую ли я фрейм данных pandas или массив numpy.

Q2: вы представляете это как сетку, где имена столбцов — x, имена строк — y, а высота (z) — поля?

Поскольку z может быть положительным или отрицательным, суша начинается, когда z> 0, что всегда будет меняться в зависимости от прилива. Я хочу иметь возможность увеличивать или уменьшать время отлива и прилива ‘на лету’ Фактическое дно морского дна также важно в зависимости от поверхности, солености, температуры воды на метр и т. Д.

Q3: это то место, где я должен перейти в 3D (в mesh?)

Сейчас я просто сосредоточился на импорте батиметрии и визуализировал то, что я импортировал графическим способом (и немного потерпел неудачу). Пока мой код выглядит так, как показано ниже, извините за отсутствие комментариев.

 import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import pandas as pd
import tkinter as tk
from tkinter import filedialog
import scipy
from scipy import interpolate

# min_? is minimum bound, max_? is maximum bound, 
#   dim_? is the granularity in that direction

filename = filedialog.askopenfilename()
df = pd.read_csv(filename, delimiter=',',names=["X", "Y", "Z"])
df.sort_values(by=["X"])

mat = df.to_numpy()

min_x = np.array(df['X'].values.tolist()).min(axis=0)
max_x = np.array(df['X'].values.tolist()).max(axis=0)
min_y = np.array(df['Y'].values.tolist()).min(axis=0)
max_y = np.array(df['Y'].values.tolist()).max(axis=0)
min_Z = np.array(df['Z'].values.tolist()).min(axis=0)
max_z = np.array(df['Z'].values.tolist()).max(axis=0)
dim_x = np.array(df['X'].count())
dim_y = np.array(df['Y'].count())


x=df.columns[0:]
y=df.columns[1:]
z=df.columns[2:]

x = np.linspace(min_x, max_x, dim_x)
y = np.linspace(min_y, max_y, dim_y)

X,Y = np.meshgrid(x, y)

#   Interpolate (x,y,z) points [mat] over a normal (x,y) grid [X,Y]
#   Depending on your "error", you may be able to use other methods
Z = scipy.interpolate.griddata((mat[:,0], mat[:,1]), mat[:,2], (X,Y),method='linear')

plt.pcolormesh(X,Y,Z)
plt.show()
  

Комментарии:

1. Поскольку pandas уже хранит числовые данные в массивах numpy, написание np.array(df['X'].values.tolist()).min(axis=0) — ужасный обход. Просто используйте df['X'].min() . О скорости, с большим количеством данных df.sort_values(by=["X"]) займет некоторое время и, вероятно, не понадобится. Что вам действительно следует пересмотреть, так это использование ‘dim_x’, поскольку количество подразделений соответствует обоим измерениям. Это слишком много, и ваш код перестанет работать, когда будет больше данных. Использование round(sqrt(dim_x)) или этого значения, умноженного на небольшую константу, было бы более разумным.

2. Спасибо @JohanC, я не понимал, что pandas уже хранит числовые данные в массивах numpy. Я попытаюсь придумать решение для dim_x (оно останавливается там даже с sqrt), но не уверен, почему. спасибо за информацию!

3. нашел мою ошибку, маленький тестовый файл был разделен запятой, большой был табуляцией, глупый я