Вы можете сделать это с помощью numpy.eye
и использовать механизм выбора элемента массива:
import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]
def indices_to_one_hot(data, nb_classes):
"""Convert an iterable of indices to one-hot encoded labels."""
targets = np.array(data).reshape(-1)
return np.eye(nb_classes)[targets]
Возвращаемое значение indices_to_one_hot(nb_classes, data)
теперь
array([[[ 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 1., 0.],
[ 1., 0., 0., 0., 0., 0.]]])
.reshape(-1)
, чтобы убедиться, что у вас есть правильный формат ярлыков (у вас также может быть [[2], [3], [4], [0]]
).
Редактирование 2: Выпуск 1.15.2 модуля анализатора тела вводит режим raw mode , который возвращает тело в качестве буфера . По умолчанию он также автоматически обрабатывает дефляцию дефляции и gzip. Пример использования:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
По умолчанию объект options
имеет следующие параметры по умолчанию:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
Если вы хотите, чтобы ваш сырой парсер разбирал другие типы MIME, кроме application/octet-stream
, вам нужно будет изменить его здесь. Он также поддерживает подстановочные знаки, такие как */*
или */application
.
Примечание: Следующий ответ для версий до Express 4, где промежуточное программное обеспечение все еще в комплекте с каркасом. Современным эквивалентом является модуль body-parser , который должен быть установлен отдельно.
Свойство rawBody
в Express было когда-то доступно, но было удалено с версии 1.5.1. Чтобы получить необработанное тело запроса, перед использованием bodyParser вы должны установить промежуточное программное обеспечение. Вы также можете прочитать обсуждение GitHub об этом здесь .
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
Это промежуточное ПО будет считываться из фактического потока данных и хранить его в свойстве rawBody
запроса , Затем вы можете получить доступ к необработанному телу следующим образом:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Изменить: кажется, что этот метод и bodyParser отказываются сосуществовать, потому что один будет потреблять поток запросов перед другим, что приведет к тому, что второе никогда не стрелять end
, тем самым никогда не вызывая next()
и не вися на вашем приложении.
Самое простое решение, скорее всего, будет изменить источник bodyParser, который вы найдете на линии 57 анализатора JSON от Connect. Это будет измененная версия.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
Вы найдете файл в этом месте:
/node_modules/express/node_modules/connect/lib/middleware/json.js
.
Будьте осторожны с этими другими ответами, поскольку они не будут играть правильно с bodyParser, если вы хотите также поддерживать json, urlencoded и т. д. Чтобы заставить его работать с bodyParser, вы должны заставить обработчика зарегистрироваться только на Content-Type
, о котором вы заботитесь, как и сам bodyParser.
Чтобы получить исходное содержимое тела запроса с Content-Type: "text/plain"
в req.rawBody
, вы можете сделать:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/plain') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
Это вариант ответа на гексаканид выше. Это промежуточное программное обеспечение также обрабатывает событие «данные», но не дожидается, когда данные будут потребляться, прежде чем вызывать «следующий». Таким образом, оба этих промежуточного слоя и bodyParser могут сосуществовать, потребляя поток параллельно.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
Это решение сработало для меня:
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));
Когда я использую решение с req.on('data', function(chunk) { });
, он не работает с куском тела запроса.
У меня есть решение, которое отлично сочетается с bodyParser, используя обратный вызов verify
в bodyParser. В этом коде я использую его, чтобы получить sha1 содержимого, а также получить сырое тело.
app.use(bodyParser.json({
verify: function(req, res, buf, encoding) {
// sha1 content
var hash = crypto.createHash('sha1');
hash.update(buf);
req.hasha = hash.digest('hex');
console.log("hash", req.hasha);
// get rawBody
req.rawBody = buf.toString();
console.log("rawBody", req.rawBody);
}
}));
Я новичок в Node.js и express.js (начался вчера, буквально!) поэтому я хотел бы услышать комментарии к этому решению.
req.rawBody = buf.toString();
и взял все остальное из функции verify
, потому что это было все, что мне было нужно, и оно прекрасно работало. Не нужно менять исходный код bodyParser!
– Greg
29 April 2015 в 16:08
req.rawBody = buf.toString(encoding);
– shaharsol
23 February 2016 в 21:20