Я здесь «самодостаточный» ответ в том смысле, что сначала я генерирую некоторые входные данные, которые затем преобразую в словарь, а затем возвращаю в исходные массивы.По пути я добавляю немного случайного шума, чтобы значения x и y были близки друг к другу, но при этом делали их уникальными.После этого ответа список всех значений, которые «близки» друг к другу, можно найти, сначала округлив значения, а затем используя np.unique
.
mport numpy as np
##generating some input data:
print('input arrays')
xvals = np.linspace(1,10, 5)
print(xvals)
yvals = np.linspace(0.1, 0.4, 4)
print(yvals)
xvals, yvals = np.meshgrid(xvals, yvals)
##adding some noise to make it more interesting:
xvals += np.random.rand(*xvals.shape)*1e-3
yvals += np.random.rand(*yvals.shape)*1e-5
zvals = np.arange(xvals.size).reshape(*xvals.shape)
print(zvals)
input_dict ={
(i,j): k for i,j,k in zip(
list(xvals.flatten()), list(yvals.flatten()), list(zvals.flatten())
)
}
##print(input_dict)
x,y,z = map(np.array,zip(*((x,y,z) for (x,y),z in input_dict.items())))
##this part will need some tweaking depending on the size of your
##x and y values
xlen = len(np.unique(x.round(decimals=2)))
ylen = len(np.unique(y.round(decimals=3)))
x = x.round(decimals=2).reshape(ylen,xlen)[0,:]
y = y.round(decimals=3).reshape(ylen,xlen)[:,0]
z = z.reshape(ylen,xlen)
print('\n', 'output arrays')
print(x)
print(y)
print(z)
Вывод выглядитнапример:
input arrays
[ 1. 3.25 5.5 7.75 10. ]
[0.1 0.2 0.3 0.4]
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
output arrays
[ 1. 3.25 5.5 7.75 10. ]
[0.1 0.2 0.3 0.4]
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
Старый ответ:
В этом ответе много предположений, в основном потому, что в вопросе недостаточно информации.Но, предполагая, что
- значения x и y упорядочены так же хорошо, как в данных примера
- значения x и y завершены
Oneможет решить проблему с пониманием списка и изменением формы nndy ndarrays:
import numpy as np
input_dict = {
(0,0): 1,
(1,0): 2,
(0,1): 3,
(1,1): 4,
}
x,y,z = map(np.array,zip(*((x,y,z) for (x,y),z in input_dict.items())))
xlen = len(set(x))
ylen = len(set(y))
x = x.reshape(xlen,ylen)[0,:]
y = y.reshape(xlen,ylen)[:,0]
z = z.reshape(xlen,ylen)
print(x)
print(y)
print(z)
, что дает
[0 1]
[0 1]
[[1 2]
[3 4]]
, надеюсь, это поможет.
PS: ЕслиЗначения x и y не обязательно находятся в порядке, предложенном опубликованными примерами данных, проблему можно решить с помощью некоторой умной сортировки.