Это не - [Pandas, Numpy, SciPy] решение. Если в какой-то момент в будущем время обработки станет раздражающим, вы можете вникнуть в них - это кривая обучения. Есть и другие преимущества, особенно с Pandas - последующий анализ может быть проще с Pandas - Но вы, вероятно, можете проводить весь анализ и без него.
- Для полос мне нужны все частицы находятся в этой полосе в любое время.
Вам нужно будет идентифицировать каждую точку данных после того, как вы объедините их все вместе. Для простоты я использовал namedtuple , чтобы создать объект для каждой точки данных.
import csv
from collections import namedtuple
Particle = namedtuple('Particle',('name','t','x','y','z','x2','y2','z2'))
Часто выбор правильного контейнера для ваших материалов важен - вы должны понять это заранее и это влияет на механику обработки позже. Я снова выбрал простоту, не задумываясь о том, как он будет использоваться позже - словарь с парами ключ / значение для каждой полосы. Каждая клавиша - это левый край полосы / бункера. Преобразование позиции y в целое число легко классифицирует ее.
# positions in example data are all negative
bins = {-0:[],-1:[],-2:[],-3:[],-4:[],-5:[],-6:[],-7:[],-8:[],-9:[]}
Используйте модуль csv для чтения всех файлов; сделать частицы; положить их в урны.
for name in range(3):
with open(f'{name}.dat') as f:
reader = csv.reader(f,delimiter=':')
# example row
# 0.0 : 0.999900,-0.999900,0.0 : -6.999000,-7.001000,0.0
for t,vel,pos in reader:
t = float(t)
x,y,z = map(float, vel.split(','))
x2,y2,z2 = map(float, pos.split(','))
p = Particle(name,t,x,y,z,x2,y2,z2)
y = int(p.y2)
#print(f'{y}:{p}')
bins[y].append(p)
Частично bins
на основе случайных данных.
{-9: [Particle(name=1, t=1000.0, x=1.09185, y=2.13655, z=-1.96046, x2=-8.74504, y2=-9.89888, z2=-9.49985),...],
-8: [Particle(name=0, t=5000.0, x=1.2371, y=1.10508, z=-0.9939, x2=-9.47672, y2=-8.90004, z2=-8.06145),
Particle(name=2, t=7000.0, x=-0.82952, y=0.14332, z=-0.3446, x2=-2.76384, y2=-8.14855, z2=-7.2325)],
-7: [...,Particle(name=2, t=12000.0, x=1.06694, y=0.02654, z=-2.93894, x2=-8.62668, y2=-7.93497, z2=-6.18243)],
-6: [Particle(name=0, t=3000.0, x=0.01791, y=-2.67168, z=-1.39907, x2=-6.00256, y2=-6.64951, z2=-6.35569),...,
Particle(name=2, t=18000.0, x=2.41593, y=-2.27558, z=-1.1414, x2=-6.90592, y2=-6.42374, z2=-9.67672)],
-5: [...],
-4: [...],
...}
Создатель случайных данных.
import numpy as np
import csv
def make_data(q=3):
for n in range(q):
data = np.random.random((21,6))
np.add(data, [-.5,-.5,-.5,0,0,0], out=data)
np.multiply(data,[6,6,6,-10,-10,-10],out=data)
np.round_(data,5,data)
t = np.linspace(0,20000,21)
data = np.hstack((t[:,None],data))
with open(f'{n}.dat', 'w', newline='') as f:
writer = csv.writer(f,delimiter=':')
writer.writerows(data.tolist())
Если в будущем вам понадобятся более тонкие полосы, скажем сотые доли единиц, просто умножьте на этот коэффициент.
>>> factor = 100
>>> y2 = -1.20513
>>> int(y2*factor)
-120
>>> d = {n:[] for n in range(0,-10*factor,-1)}
>>> d[int(y2*factor)].append(str(y2))
>>> d[-120]
['-1.20513']
>>>