numpy массив для значений с плавающей точкой в ​​пределах диапазона - PullRequest
2 голосов
/ 19 февраля 2020

Что касается эффективности, как мы можем создать большой массив numpy, где значения являются числами с плавающей запятой в заданном диапазоне c.

Например, для массива 1-D numpy фиксированного размера, где значения находятся в диапазоне от 0 до 200 000 000,00 (т. е. значения в [0, 200 000 000,00]), я могу создать массив, используя наименьший тип данных для чисел с плавающей запятой (float16), а затем проверить любое новое значение (из пользовательского ввода) перед вставкой его в массив:

import numpy as np

a = np.empty(shape=(1000,), dtype=np.float16))
pos = 0

new_value = input('Enter new value: ')

# validate
new_value = round(new_value, 2)
if new_value in np.arange(0.00, 200000000.00, 0.01):
    # fill in new value
    a[pos] = new_value
    pos = pos + 1

Вопрос в том, можем ли мы принудительно установить валидность new_value (с точки зрения уже известных минимальных / максимальных значений и количества десятичных знаков) на основе dtype из массива?

Другими словами, тот факт, что мы знаем диапазон и количество десятичных знаков во время создания массива, дает ли это нам какую-либо возможность (более) эффективно вставить действительные значения в массив?

1 Ответ

1 голос
/ 19 февраля 2020

Я немного озадачен тем, как работает ваш код, потому что он не работает, как представлено здесь.

Также немного неясно, почему вы хотите добавить новые значения в пустой массив, который вы создали заранее. , Вы хотели заполнить созданный массив новыми входящими значениями вместо добавления?

np.arange(0.00, 200000000.00, 0.01)

Эта строка вызывает проблемы, поскольку она создает огромный массив со значениями, ведущими к MemoryError в моей среде только для того, чтобы проверьте, находится ли new_value в определенном диапазоне.

Расширение моего комментария и исправление проблем с вашим кодом мое решение будет выглядеть как

import numpy as np

max_value =  200000000
arr = np.empty(shape=(1000,), dtype=np.float16)

new_value = float(input('Enter new value: ')) # More checks might be useful if input is numeric

# validate
if 0 <= new_value <= max_value:
    new_value = round(new_value, 2) # round only if range criterion is fulfilled
    arr = np.append(arr, new_value) # in case you really want to append your value
...