#python
Вопрос:
В настоящее время я беру класс численных методов и написал функцию для устранения Гаусса. Я заметил, что по какой-то причине при выполнении операций с массивом numpy python не удается преобразовать целые числа в плавающие. поэтому я получаю нули вместо плавающей точки. Вот фрагмент кода, который выполняет исключение Гаусса
for k in range(h - 1):
p = k
B = a[k, k]
for i in range(k 1, l):
if a[i, k] > B:
B = a[i, k]
p = i
if p != k:
a[[k, p]] = a[[p, k]]
b[[k, p]] = b[[p, k]]
for i in range(k 1, l):
s = a[i, k] / a[k, k]
for g in range(l):
a[i, g] = a[i, g] - s * a[k, g]
b[i, 0] = b[i, 0] - s * b[k, 0]
Вот входные данные, используемые при вызове функции:
a = np.array([[8, 4, -1], [-2, 5, 1], [2, -1, 6]])
b = np.array([[11], [4], [7]])
print(GaussElim(a, b)[4])
Есть идеи, почему это может происходить? Я могу обойти проблему, просто записав свои входные данные в виде поплавков, но я бы хотел избежать этого, если это возможно. Я запускаю Python 3.9.7 в последней версии VS-кода.
Я использую массивы numpy для своих входных матриц, если это на что-то влияет.
**Примечание: Я заметил, что элементы массива остаются целыми и не преобразуются в плавающие при работе. Изменение моих входных данных в массив numpy для запуска в виде поплавков решает проблему, но мне бы не хотелось писать «.0» в конце каждого ввода для чистоты.
Комментарии:
1. В качестве примечания вы можете просто добавить «.» в конце вместо «.0», чтобы сделать его плавающим.
2. Вы можете изменить значения массива на значения с плавающей точкой в
GausElim
классе следующим образом:array.astype('float64')
3.
dtype
В чем — то похожемnp.array([[8, 4, -1], [-2, 5, 1], [2, -1, 6]], dtype=np.float32)
?
Ответ №1:
Я считаю , что Python выполняет операции в виде поплавков, но поскольку массивы являются dtype=int64
таковыми, они преобразуются обратно в целые числа, чтобы сохранить их.
Как упоминает комментарий @Ynjxsjmh, вы можете явно указать dtype
, чтобы массивы плавали по спецификации:
a = np.array([[8, 4, -1], [-2, 5, 1], [2, -1, 6]], dtype='float64')
b = np.array([[11], [4], [7]], dtype='float64')
В качестве альтернативы, поскольку все элементы в массиве имеют один и тот же тип, вы можете просто принудительно ввести его, добавив точку к одному из чисел:
a = np.array([[8., 4, -1], [-2, 5, 1], [2, -1, 6]])
b = np.array([[11.], [4], [7]])
Комментарии:
1. Спасибо! Это решает мой вопрос! Следующий вопрос для использования в будущем: если бы я хотел, чтобы некоторые элементы были целыми, а другие-плавающими, как бы вы этого добились? Похоже, что все упомянутые вами решения сделают весь массив либо целыми числами, либо плавающими.
2. Кроме того, есть ли способ заставить его возвращать целые числа вместо x.00000000e /-xx, если операция не изменяет его на целое число?
3. Невозможно, чтобы разные записи массивов numpy были разного типа. Если вы хотите этого, я бы изменил код для работы со списком списков (поскольку списки допускают любой тип). Я не знаю сразу, как получить то, что вы хотите, с точки зрения форматов печати, но я бы посмотрел на указание пользовательского форматера в numpy.set_printoptions
4. Как сказал @atony, это правда, что все ячейки в массиве numpy должны быть одного типа. Но в NumPy есть еще один вид структуры данных, называемый структурированными массивами , в которых вы можете (до определенного момента) смешивать типы данных.