Aleksandr_Ph
Да, верно!
Верно!
Тогда я бы просто посчитал “вручную”:
#
from numpy import zeros
from random import random
def coord2index(coordinates, bounds):
index = []
for x, b in zip(coordinates, bounds):
if x<b[0] or x>b[-1]:
print('Error. Out of bounds.',x,b)
return None
for i,value in enumerate(b[1:]):
if value>=x:
index.append(i)
break
return tuple(index)
bounds = [[0,1,2], [0,1,2,3]]
data = []
for i in range(10**3):
y = random()*bounds[0][-1]
x = random()*bounds[1][-1]
data.append((y, x, x+y))
shape = tuple(len(b)-1 for b in bounds)
summ = zeros(shape, float)
num = zeros(shape, int)
mean = zeros(shape, float)
for d in data:
x = d[:-1]
v = d[-1]
index_tuple = coord2index(x,bounds)
summ[index_tuple] += v
num[index_tuple] += 1
mean.flat = [s/n for s,n in zip(summ.flat, num.flat)]
print(mean)
bounds - границы интервалов для каждой из осей. тут две оси.
data - данные для куба. тут из random, а должны читаться из файла.
summ, num – многомерные массивы (numpy.ndarray) с суммой значений функции попавших в интервал точек и их количеством. заполняются нулями при создании. всегда можно добавить дополнительные точки.
shape описывает размерность этих массивов.
mean – само среднее, сумма/кол-во. т.е. “куб”. после добавления точек пересчитывается:
mean.flat = ..
Не уверен, что так можно делать (что не начнёт вдруг путать последовательность), но вроде работает.
num[index_tuple]
# вместо ndarray[i][j] можно писать ndarray[(i,j)], т.е. ndarray[tuple]
Дальше берём сколько угодно значений “из куба”:
#
y =1.1, x= 1.2
index_tuple = coord2index([y,x], bounds)
v = mean[index_tuple]