NumPy empty () массив не дает случайное значение с плавающей запятой после определения нормального массива NumPy - PullRequest
0 голосов
/ 26 января 2019

Я использовал NumPy np.empty(), чтобы получить массив со случайным значением, но он не работает, когда я определяю нормальный np.array() раньше.

Вот две функции, которые я использовал:

import numpy as np

def create_float_array(x):
    return np.array([float(x)])

def get_empty_array():
    return np.empty((), dtype=np.float).tolist()

Просто чтобы проверить get_empty_array(), я написал в консоли:

>>> get_empty_array() # Should return a random float
>>> 0.007812501848093234

Я был доволен результатом, поэтому я попробовал это, но это не сработалотак, как я хотел:

>>> create_float_array(3.1415) # Create a NumPy array with the float given
>>> array([3.1415])
>>> get_empty_array() # Should return another random value in a NumPy array
>>> 3.1415

Я не слишком уверен, почему создание массива NumPy влияет на метод np.empty() от предоставления случайного значения.По-видимому, он дает то же значение, что и значение в np.array (), в данном случае 3.1415.

Обратите внимание, что я решил оставить форму np.empty() равной нулю для целей тестирования., но на самом деле это будет иметь некоторую форму.

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

1 Ответ

0 голосов
/ 26 января 2019

Просто чтобы прояснить вопрос:

np.empty не дает действительно случайных значений. Официальная документация NumPy гласит , что она будет содержать «неинициализированные записи» или «произвольные данные»:

numpy.empty(shape, dtype=float, order='C')

Возвращает новый массив заданной формы и типа без инициализации записей.

[...]

Возвращает:

out: ndarray

Массив неинициализированных (произвольных) данных заданной формы, d-типа и порядка. Массивы объектов будут инициализированы как None.

Так что же означает неинициализированный или произвольный? Чтобы понять, что вы должны понимать, что когда вы создаете объект (любой объект), вам нужно попросить кого-то (что кто-то может быть внутренним компонентом NumPy, внутренним компонентом Python или вашей ОС) требуемый объем памяти.

Поэтому, когда вы создаете пустой массив, NumPy запрашивает память. Объем памяти для массива NumPy будет некоторым излишним для объекта Python и определенным объемом памяти для хранения значений массива. Эта память может содержать что угодно. Таким образом, «неинициализированное значение» означает, что оно просто содержит то, что находится в той памяти, которую вы получили.

То, что произошло здесь, просто совпадение. Вы создали массив, содержащий один объект с плавающей точкой, затем распечатали его, а затем снова уничтожили, потому что никто не сохранил ссылку на него (хотя это специфично для CPython, другие реализации Python могут не сразу освобождать память, они просто освобождают ее в конце концов). Затем вы создаете пустой массив, содержащий один float. Объем памяти для второго массива идентичен объему памяти, только что освобожденному первой памятью. Вот тут-то и происходит совпадение: возможно, что-то (NumPy, Python или ваша ОС) решило снова предоставить вам ту же область памяти.

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