Получение разных результатов для одной и той же операции в Windows 10 и виртуальной машине Ubuntu - PullRequest
0 голосов
/ 24 февраля 2019

Я добавляю 1 к некоторым элементам массива.В Win 10 все работает нормально.Но в Ubuntu, работающем на виртуальной машине в качестве гостевой ОС, программа генерирует огромные числа, которые не могут быть результатом моего кода.Например, в Linux вместо "11", который является правильным результатом, он выдаст что-то вроде этого: 4846223038150164788 "!!!!

Может кто-нибудь сказать мне, что не так?

Здесьявляется частью кода:

Import numpy as np
A = [1, 2, 3, 4, 5, 6]
B = [1, 3, 1, 7, 8, 5, 4, 3, 1, 5, 8, 9, 10, 5]
counter = np.ndarray(shape = (len(A),10) , dtype = np.int64)
for k in B:
    x = np.int64(1)
    if k == int(word[0]):
        counter[n][D[k][0]] += x

Я хочу проверить свой код, чтобы увидеть, работает ли он должным образом в Linux. Если проблема с виртуальной машиной, есть ли другой способ проверитьмой код и увидеть результаты?

1 Ответ

0 голосов
/ 25 февраля 2019

Не следует использовать numpy.ndarray() для создания новых массивов NumPy.Это связано с тем, что NumPy будет распределять данные для массива, но не инициализировать значения, то есть они получат данные, которые оказались во вновь выделенной памяти (когда память освобождается, это нене сбрасывается, ссылки на него просто удаляются).

Вы можете увидеть это в действии, если посмотрите любой массив, созданный numpy.ndarray() без каких-либо дальнейших изменений:

>>> numpy.ndarray((5,))
array([2.68156159e+154, 2.68156159e+154, nan, 0.00000000e+000, 2.68156159e+154])

IЯ не уверен, почему это не проблема для Windows тоже.Возможно, Windows инициализирует вновь выделенную память.Также может случиться так, что у вашей виртуальной машины Linux меньше памяти, и поэтому она с большей вероятностью будет повторно использовать память, чем хост Windows, который имеет больше памяти и, следовательно, с большей вероятностью предоставит вам «свежую» (ранее не использованную) память при выделении.,Я видел ошибку, которая предполагает инициализацию памяти, и она будет надежно отображаться только на компьютерах с малым объемом памяти.

В любом случае измените вашу инициализацию на:

counter = np.zeros((len(A),10), dtype=np.int64)

Иэто должно решить вашу проблему.

Из документов:

Массивы должны быть построены с использованием массива, нулей или пустых (см. раздел См. также ниже).Параметры, приведенные здесь, относятся к низкоуровневому методу (ndarray (…)) для создания экземпляра массива.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html?highlight=ndarray#numpy.ndarray

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...