Как эффективно преобразовать значения numpy в массив индексов диапазона

#python #numpy

#python #numpy

Вопрос:

Я пытаюсь найти эффективный способ получения числового массива значений с плавающей запятой и преобразования их в индекс, связанный с определенным диапазоном.

например, массив numpy из x с плавающей точкой [ -999.99, 433.000, -56.00….] ( этот массив на самом деле довольно большой, обычно от 6000 до 25000 значений.

Информация о диапазоне фактически состоит из гораздо меньших от 3 до 20 строк (y) начальных значений диапазона (расположенных в возрастающей последовательности). например [-9999.0, 0.0, 0.0, 500.0 99999.0]. Значение может быть повторено, как показано со значением 0.0.

Затем это используется для построения набора диапазонов таким образом, чтобы начало диапазона = [: yrows — 2] и конец = [1:yrows -1], так что это дает ряд диапазонов [(-9999.0, 0.0), (0.0, 0.0), (0.0, 500.0), (500.0, 99999.0) с общим количеством строк строк -1 (затем может быть сгенерирован индекс, соответствующий каждой строке

Тогда мне нужно получить эквивалент индекса строки y, в которой было исходное значение x с плавающей запятой (на x с плавающей запятой будет только одно). Затем я буду использовать индекс для получения дополнительной информации, связанной с этим конкретным диапазоном.

например, индексы [ -999.99, 433.000, -56.00….] даст значения индекса[0, 2, 0 …] Для ясности обратите внимание, что значения x никоим образом не сортируются, но всегда будут больше, чем наименьшее значение диапазона массива, и меньше, чем наибольшее значение диапазона массива.

Индексация будет работать таким образом, чтобы требуемый индекс был таким, где x>= начало диапазона и меньше конца диапазона, таким образом, (0.0, 0.0) запись выше — это диапазон, который никогда не будет выбран, и он предназначен для создания новых атрибутов end / start только для предыдущих, следующих диапазонов.

Хорошо, это было решено. Numpy.digitize делает именно то, что мне нужно, например, numpy.digitize(xfloatarray, ybins, right= False).

Я просто не сталкивался с этой функцией и не мог найти ее в Google до публикации… Я просто продолжал получать результаты о разделении массивов или создании индексов.

Комментарии:

1. Вы пробовали что-нибудь до сих пор? Где вы застряли?

2. Привет, я не мог найти функцию, которая могла бы помочь, и не хотел настраивать цикл python. Как правило, я только что нашел что-то и думаю, что мне нужно использовать numpy.digitize. Похоже, это поможет

3. Хорошо, это было, как обычно, довольно просто, когда вы знаете правильную функцию. numpy.digitize() отлично справился с задачей.

4. Если вы решили проблему, вполне допустимо опубликовать ее в качестве ответа ниже, а затем пометить как решение. Это помогает, если кто-то ищет Stack Overflow с аналогичным вопросом.

5. Хорошо, спасибо, теперь я это сделал.

Ответ №1:

Хорошо, это было решено. numpy.digitize Делает именно то, что мне нужно, например

 numpy.digitize(xfloatarray, ybins, right=False)
 

где xfloatarray был мой массив с плавающей точкой [ -999.99, 433.000, -56.00....]

и ybins был ли мой массив значений диапазона [-9999.0, 0.0, 0.0, 500.0 99999.0]

результат дает [1,3,1..]

если в нем используется значение 0.0 xfloatarray , оно возвращает значение 3, т.е. Значение 2 не будет возвращено.