Вот метод получения свойства или вложенного объекта из объекта с использованием нотации пути. Это адаптация аналогичного вопроса, заданного «Prusprus» в 2014 году.
У меня есть файл конфигурации с вложенными массивами и вы хотите получить доступ к данным с веб-страницы, отправив путь в form:
"unit_cfg [2] .chn_cfg [7] .chn_type"
Эта функция вернет одно свойство или объект. Да, это можно упростить ...
function fetchFromObject(obj: Object, path: string): boolean | Object {
var dot_idx: number;
var lbkt_idx: number;
var rbkt_idx: number;
var prop: string;
var prop_idx: number;
var new_obj: Object;
var new_path: string;
// Return if no object.
if (typeof obj === 'undefined') {
return false;
}
// Get index of first left bracket in path.
lbkt_idx = path.indexOf('[');
// If left bracket.
if (lbkt_idx > -1) {
// Get right bracket index.
rbkt_idx = path.indexOf(']');
}
// Get index of first dot in path.
dot_idx = path.indexOf('.');
/*
* Most complicated situation is if there are both brackets
* and dots in the path. This means we have a mixture of both
* indexed and non-indexed properties:
*
* x[].y --or-- x.y[]
*
* In this case, we must see if the indexed property is before
* or after the non-indexed property.
*
* In either case, we must recurse.
*/
if ((lbkt_idx > -1) && (dot_idx > -1)) {
// If bracket is before dot: x[].y
if (lbkt_idx < dot_idx) {
// Get property string.
prop = path.substr(0, lbkt_idx);
// Get index.
prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
// Get path to right of dot.
new_path = path.substr(dot_idx + 1);
// Get new object.
new_obj = obj[prop][prop_idx];
// Recurse.
return fetchFromObject(new_obj, new_path);
}
// Else dot before bracket: x.y[]
else {
// Get property string.
prop = path.substr(0, dot_idx);
// Get path to right of dot.
new_path = path.substr(dot_idx + 1);
// Get new object.
new_obj = obj[prop];
// Recurse.
return fetchFromObject(new_obj, new_path);
}
}
/*
* Else recurse if dotted property; x.y
*/
else if (dot_idx > -1) {
// Get property string.
prop = path.substr(0, dot_idx);
// Get path to right of dot.
new_path = path.substr(dot_idx + 1);
// Get new object.
new_obj = obj[prop];
// Recurse.
return fetchFromObject(new_obj, new_path);
}
/*
* Else done if single indexed property: x[]
*/
else if (lbkt_idx > -1) {
// Get property string.
prop = path.substr(0, lbkt_idx);
// Get index.
prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
// Return with object.
return obj[prop][prop_idx];
}
/*
* Else single non-indexed property.
*/
return obj[path];
}
Ваша проблема несколько неясна.
Я пробовал
blockquote>plt.hist()
, что дает еще один нормальный график распределения.Ну, не совсем; это дает бимодальную гауссову смесь график:
arr, blob_labels = make_blobs(n_samples=1000, n_features=1, centers=2, random_state=1) a = plt.hist(arr, bins=np.arange(int(np.min(arr))-1,int(np.max(arr))+1,0.5), width = 0.3)
, как и ожидалось, так как теперь мы имеем [114 ].
Я понятия не имею, как использовать
blockquote>plt.scatter()
с данными.По определению для диаграммы рассеяния требуются двумерные данные; из документов :
Диаграмма рассеяния y против x с изменяющимся размером маркера и / или цветом.
blockquote>, в то время как здесь, благодаря
n_features=1
, у нас на самом деле есть только x и нет y .1D «график рассеяния» на самом деле является линией, и мы можем использовать
plot
для ее визуализации, как хорошо объяснено в Как построить 1-d данные при заданном значении y с помощью pylab ; в вашем случае:val = 0. # this is the value where you want the data to appear on the y-axis. a = plt.plot(arr, np.zeros_like(arr) + val, 'x')
, где, конечно, следует помнить, что вертикальная ось - это просто удобство для визуализации и ничего не говорит о наших данных, которые вообще не имеют значения y .
Хотите использовать разные цвета и / или маркеры для каждого центра?
val = 0. # this is the value where you want the data to appear on the y-axis. plt.plot(arr[blob_labels==0], np.zeros_like(arr[blob_labels==0]) + val, 'x', color='y') plt.plot(arr[blob_labels==1], np.zeros_like(arr[blob_labels==1]) + val, '+', color='b') plt.show()
где для больших выборок начинается ситуация становится несколько интереснее; обратите внимание на перекрытие для
n_samples=10000
: