Умножьте строку за строкой, чтобы получить новую матрицу с numpy или pandas [duplicate]

Чтобы предложить лучшее решение, я могу сказать, что обнаружил следующий метод:

parseFloat((0.1 + 0.2).toFixed(10)) => Will return 0.3

Позвольте мне объяснить, почему это лучшее решение. Как упоминалось выше в других ответах, рекомендуется использовать готовые для использования функции Javascript toFixed () для решения проблемы. Но, скорее всего, вы столкнетесь с некоторыми проблемами.

Представьте, что вы собираетесь добавить два числа с плавающей запятой, такие как 0.2 и 0.7, вот оно: 0.2 + 0.7 = 0.8999999999999999.

Ваш ожидаемый результат 0.9 означает, что в этом случае вам нужен результат с точностью до 1 цифры. Поэтому вы должны были использовать (0.2 + 0.7).tofixed(1), но вы не можете просто указать определенный параметр toFixed (), поскольку он зависит от заданного числа, например

`0.22 + 0.7 = 0.9199999999999999`

. В этом примере вам нужна точность в 2 цифры так что это должно быть toFixed(2), так что должно быть параметром для каждого заданного числа с плавающей запятой?

Вы могли бы сказать, что пусть это будет 10 в каждой ситуации:

(0.2 + 0.7).toFixed(10) => Result will be "0.9000000000"

Черт! Что вы собираетесь делать с этими нежелательными нулями после 9? Пришло время преобразовать его в float, чтобы сделать его по вашему желанию:

parseFloat((0.2 + 0.7).toFixed(10)) => Result will be 0.9

Теперь, когда вы нашли решение, лучше предложить его как функцию:

function floatify(number){
       return parseFloat((number).toFixed(10));
    }
 
function addUp(){
  var number1 = +$("#number1").val();
  var number2 = +$("#number2").val();
  var unexpectedResult = number1 + number2;
  var expectedResult = floatify(number1 + number2);
  $("#unexpectedResult").text(unexpectedResult);
  $("#expectedResult").text(expectedResult);
}
addUp();
input{
  width: 50px;
}
#expectedResult{
color: green;
}
#unexpectedResult{
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="number1" value="0.2" onclick="addUp()" onkeyup="addUp()"/> +
<input id="number2" value="0.7" onclick="addUp()" onkeyup="addUp()"/> =
<p>Expected Result: <span id="expectedResult"></span></p>
<p>Unexpected Result: <span id="unexpectedResult"></span></p>

Вы можете использовать его следующим образом:

var x = 0.2 + 0.7;
floatify(x);  => Result: 0.9
2
задан Shweta 2 February 2016 в 20:28
поделиться

1 ответ

Вы можете использовать размеры продолжения A и B с np.newaxis/None , чтобы ввести broadcasting для векторизованного решения так же -

A[...,None]*B[:,None,:]

Объяснение: np.outer(np.transpose(A[i]), B[i]) в основном выполняет элементное умножение между столбчатой ​​ версией A[i] и B[i]. Вы повторяете это для всех строк в A для сопоставления строк в B. Обратите внимание, что np.transpose(), похоже, не оказывает никакого влияния, поскольку np.outer заботится о предполагаемых элементарных умножениях.

Я бы описал эти шаги в векторизованном языке и, таким образом, реализовать так:

  1. Расширить размеры A и B, чтобы сформировать фигуры 3D для обоих из них, чтобы мы сохранили axis=0 и сохранили как axis=0 в обеих этих расширенных версиях. Таким образом, нам остается решать две последние оси.
  2. Чтобы ввести элементарные умножения, нажмите axis=1 из A в своей исходной 2D-версии на axis=1 в своем 3D, тем самым создавая одномерное измерение в axis=2 для расширенной версии A.
  3. Это последнее одноэлементное измерение версии 3D A должно совпадать с элементами из axis=1 в оригинальной 2D версии B, чтобы broadcasting произошло. Таким образом, расширенная версия B имела бы элементы из axis=1 в своей 2D-версии, которые были бы нажаты на axis=2 в ее версии 3D, тем самым создавая одномерное измерение для axis=1.

Наконец, расширенные версии: A[...,None] & amp; B[:,None,:], умножив, кто даст нам желаемый результат.

2
ответ дан Divakar 26 August 2018 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: