попробуйте это просто
var arr = [false,1,0,1,2,0,1,3,"a"];
arr.sort(function(a,b){if (a===0){return 1}});
document.body.innerHTML += JSON.stringify(arr);
+1 к seberg, вот примерный пример, чтобы проиллюстрировать, что вы не должны отображать раунд: (Извините, это стиль matlab, но вы легко pythonize)
a =
3 0
0 3
1 1
b =
2.71
11.7
0.5
x = a\b =
0.5121
3.5088
round(x) =
1
4
norm(a*round(x)-b) = 4.5193
norm(a*[0;4]-b) = 4.4367
norm(a*[1;3]-b) = 4.4299
Когда вы конвертируете в int
, десятичная часть элементов усекается, поэтому округляется вниз.
a = np.array([[1,0], [0,1], [-1,1]])
b = np.array([1,1,0])
x = np.linalg.lstsq(a,b)[0]
Результат:
>>> x
array([ 1., 1.])
>>> x[0]
0.99999999999999967
>>> x[1]
1.0000000000000002
>>> x.astype(int)
array([0, 1])
>>> map(int, x)
[0, 1]
>>> np.array([1.,1.]).astype(int) # works fine here
array([1, 1])
Возможно, я не понимаю вашу проблему, но думаю, вам просто нужна комбинация round
, а затем astype(int)
?
Например:
a = np.array([[1,0], [0,1], [-1,1]])
b = np.array([1,1,0])
x = np.linalg.lstsq(a,b)[0]
print x.round().astype(int)
LAPACK
и т. Д., Поэтому функции, такие как lstsq
, являются, по сути, плавающей точкой. Я думаю, что между ответом NPE, чтобы определить, существует ли решение, и предложение Себерга попробовать нелинейный решатель, вы можете, вероятно, собрать что-то вместе. Округленное или усеченное решение с плавающей точкой может дать хорошее исходное предположение для нелинейного решателя, если ничего другого.
– Joe Kington
16 December 2012 в 17:34
Существует метод, называемый block lanczos. Это может быть ваш ответ по конечному полю. Для этой конкретной проблемы есть решатели блоков lanczos.
Вы должны использовать специализированные решатели задач целого числа (обратите внимание, что целочисленные проблемы даже не решены). openopt
- это пакет, который, например, должен обеспечивать хорошие обертки для целочисленной квадратичной оптимизации, например, вы делаете. Попытка использовать линейную алгебру просто не даст вам правильного решения, которое непосредственно.
Ваша проблема может быть записана как с квадратичной программой , но она является целым числом , поэтому для этого используйте openopt
или какой-либо другой модуль. Так как это очень простой, безусловный, возможно, есть и другой подход. Но для начинающих это не простая проблема, поначалу она выглядит, и есть программы в openopt и т. Д., Готовые эффективно решить эту проблему.
Мне нужно было это сделать и в итоге портировал программу на PHP, написанную Кейтом Мэтьюсом, которую вы можете найти на http://www.numbertheory.org/php/php.html , в Python , Сначала я использовал массивы Numpy, но столкнулся с проблемами с целыми переполнениями, поэтому переключился на матрицы Sympy, которые используют произвольные прецизионные численные представления.
Код выпущен на GitHub в https://github.com/ tclose / Diophantine в соответствии с лицензией MIT, поэтому не стесняйтесь использовать его и дайте мне знать, если у вас возникнут проблемы (извините, что это не лучше документировано). Мастер-ветвь использует Sympy, но вы можете получить доступ к исходной реализации Numpy в ветке «numpy», которая, похоже, работает нормально для разумно разреженных систем.
Если вы в конечном итоге используете ее для научной публикации, пожалуйста, цитируйте Кит (и, возможно, добавить ссылку на репозиторий GitHub).