В numpy data.T
ничего не делает с базовым массивом 1D. Он просто манипулирует шагами для получения транспонирования. Это делает операцию постоянной и постоянной памяти.
Похоже, что pycuda.to_gpu()
не соблюдает шаги и просто копирует базовый 1D-массив. Это даст точное поведение, которое вы наблюдаете.
На мой взгляд, в коде нет ничего плохого. Скорее, я считаю это ошибкой в pycuda
.
Я googled вокруг и нашел поток, который подробно обсуждает эту проблему .
В качестве обходного пути вы можете попробовать передать numpy.ascontiguousarray(data.T)
в gpuarray.to_gpu()
. Это, конечно же, создаст вторую копию данных в оперативной памяти хоста.
Примечание: Это обновленный ответ. Комментарии ниже относятся к старой версии, в которой использовались коды клавиш.
Попробуйте сами на JSFiddle .
Для этого нет собственной реализации jQuery, но вы можете фильтровать ввод значения текста
со следующим плагином inputFilter
(поддерживает копирование + вставку, перетаскивание + отпускание, сочетания клавиш, операции контекстного меню, клавиши без ввода, положение каретки, различные раскладки клавиатуры и все браузеры, начиная с IE 9 ):
// Restricts input for the set of matched elements to the given inputFilter function.
(function($) {
$.fn.inputFilter = function(inputFilter) {
return this.on("input keydown keyup mousedown mouseup select contextmenu drop", function() {
if (inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if (this.hasOwnProperty("oldValue")) {
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
} else {
this.value = "";
}
});
};
}(jQuery));
Теперь вы можете использовать плагин inputFilter
для установки входного фильтра:
$(document).ready(function() {
$("#myTextBox").inputFilter(function(value) {
return /^\d*$/.test(value); // Allow digits only, using a RegExp
});
});
См. демонстрацию JSFiddle для получения дополнительных примеров входного фильтра. Также обратите внимание, что вы все еще должны выполнять проверку на стороне сервера!
На самом деле jQuery для этого не нужен, вы можете сделать то же самое с чистым JavaScript. См. этот ответ .
HTML 5 имеет собственное решение с
(см. Спецификацию ) , но обратите внимание, что поддержка браузеров различается:
, Атрибуты min
и max
. e
и E
в поле. Также см. этот вопрос . $(document).ready(function() {
$("#txtboxToFilter").keydown(function(event) {
// Allow only backspace and delete
if ( event.keyCode == 46 || event.keyCode == 8 ) {
// let it happen, don't do anything
}
else {
// Ensure that it is a number and stop the keypress
if (event.keyCode < 48 || event.keyCode > 57 ) {
event.preventDefault();
}
}
});
});
Источник: http://snipt.net/GerryEng/jquery-making-textfield-only-accept-numeric-values
Вы можете использовать эту функцию JavaScript:
function maskInput(e) {
//check if we have "e" or "window.event" and use them as "event"
//Firefox doesn't have window.event
var event = e || window.event
var key_code = event.keyCode;
var oElement = e ? e.target : window.event.srcElement;
if (!event.shiftKey && !event.ctrlKey && !event.altKey) {
if ((key_code > 47 && key_code < 58) ||
(key_code > 95 && key_code < 106)) {
if (key_code > 95)
key_code -= (95-47);
oElement.value = oElement.value;
} else if(key_code == 8) {
oElement.value = oElement.value;
} else if(key_code != 9) {
event.returnValue = false;
}
}
}
И вы можете привязать ее к своему текстовому полю следующим образом:
$(document).ready(function() {
$('#myTextbox').keydown(maskInput);
});
Я использую вышеуказанное в продакшене, и он отлично работает, и это кроссбраузерно. Кроме того, он не зависит от jQuery, поэтому вы можете привязать его к текстовому полю с помощью встроенного JavaScript:
<input type="text" name="aNumberField" onkeydown="javascript:maskInput()"/>
Необходимо убедиться, что цифровая клавиатура и клавиша табуляции тоже работают
// Allow only backspace and delete
if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9) {
// let it happen, don't do anything
}
else {
// Ensure that it is a number and stop the keypress
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105)) {
}
else {
event.preventDefault();
}
}
Вы можете просто использовать простое регулярное выражение JavaScript для проверки чисто числовых символов:
/^[0-9]+$/.test(input);
Это возвращает истину, если ввод числовой, или ложь, если нет.
или для ключевого кода события, простое использование ниже:
// Allow: backspace, delete, tab, escape, enter, ctrl+A and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
// Allow: Ctrl+A
(e.keyCode == 65 && e.ctrlKey === true) ||
// Allow: home, end, left, right
(e.keyCode >= 35 && e.keyCode <= 39)) {
// let it happen, don't do anything
return;
}
var charValue = String.fromCharCode(e.keyCode)
, valid = /^[0-9]+$/.test(charValue);
if (!valid) {
e.preventDefault();
}
Использовать функцию JavaScript isNaN ,
if (isNaN($('#inputid').val()))
if (isNaN (document.getElementById ('inputid'). Val ()))
if (isNaN(document.getElementById('inputid').value))
Обновление: И вот хорошая статья об этом, но с использованием jQuery: Ограничение ввода в текстовые поля HTML числовыми значениями
Вот функция, которую я использую:
// Numeric only control handler
jQuery.fn.ForceNumericOnly =
function()
{
return this.each(function()
{
$(this).keydown(function(e)
{
var key = e.charCode || e.keyCode || 0;
// allow backspace, tab, delete, enter, arrows, numbers and keypad numbers ONLY
// home, end, period, and numpad decimal
return (
key == 8 ||
key == 9 ||
key == 13 ||
key == 46 ||
key == 110 ||
key == 190 ||
(key >= 35 && key <= 40) ||
(key >= 48 && key <= 57) ||
(key >= 96 && key <= 105));
});
});
};
Затем вы можете прикрепить ее к вашему элементу управления, сделав:
$("#yourTextBoxName").ForceNumericOnly();
function suppressNonNumericInput(event){
if( !(event.keyCode == 8 // backspace
|| event.keyCode == 46 // delete
|| (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end
|| (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard
|| (event.keyCode >= 96 && event.keyCode <= 105)) // number on keypad
) {
event.preventDefault(); // Prevent character input
}
}
Чтобы подробнее рассказать об ответе №3, я бы сделал следующее (ПРИМЕЧАНИЕ: все еще не поддерживает операции вставки с помощью клавиатуры или мыши):
$('#txtNumeric').keypress(
function(event) {
//Allow only backspace and delete
if (event.keyCode != 46 && event.keyCode != 8) {
if (!parseInt(String.fromCharCode(event.which))) {
event.preventDefault();
}
}
}
);