С NumPy только, вы могли бы использовать np.unique(..., return_indx=True)
найти индексы, которые разграничивают куски с постоянным A
значения:
data_temp.sort(order=['A'])
uniqs, idx = np.unique(data_temp['A'], return_index=True)
idx = np.r_[idx, len(data_temp)]
# >>> idx
# array([ 0, 10, 20, 33, 42, 50, 58, 71, 79, 90, 100])
Затем вы можете получить доступ к ломтям data_temp
с постоянной A
значения, используя
data_temp[idx[i], idx[i+1]]
для каждого i = 0,..., len(idx)-1
.
Это быстрее, чем при использовании
for val in uniqs:
mask = data_temp['A'] == val
chunk = data_temp.loc[mask]
потому, что доступ к основным ломтиков гораздо быстрее, чем передовые индексации с булевыми масок выделения.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2016)
data_temp = np.random.randint(10, size=(6*100)).view(
[(col, '<i8')for col in list('ABCDEF')])
data_temp.sort(order=['A'])
uniqs, idx = np.unique(data_temp['A'], return_index=True)
idx = np.r_[idx, len(data_temp)]
result = []
for i in range(len(idx)-1):
val = uniqs[i]
start, end = idx[i], idx[i+1]
# Uncomment to see the chunks of `data_temp` with constant A value
# print(data_temp[start:end])
mean = {col:data_temp[col][start:end].mean() for col in ['B', 'E']}
result.append([val, mean['B'], 0, 1, mean['E']])
result = np.array(result)
print(result)
fig, ax = plt.subplots()
ax.plot(result[:, 0], result[:, 1])
ax.plot(result[:, 0], result[:, 4])
plt.show()
Если у вас есть Pandas, весь расчет становится невероятно просто:
import pandas as pd
import matplotlib.pyplot as plt
data_temp = pd.read_csv(dir_readfile, delimiter='\t', skiprows=1, names=names,
usecols=list(range(6)))
fig, ax = plt.subplots()
result = data_temp.groupby('A').agg({'B':'mean', 'E':'mean'})
result.plot()
plt.show()
Является 'data_temp' Pandas DataFrame? – unutbu
Нет только массив numpy – DBB
data_temp = np.genfromtxt (dir_readfile, dtype = float, delimiter = '\ t', names = names, usecols = [0,1,2,3,4,5], skip_header = 1) – DBB