как сгенерировать массив в котлин похож на numpy? - PullRequest
1 голос
/ 21 апреля 2019

привет, позвольте мне продемонстрировать на python, чего я хочу достичь в kotlin:

np.linspace(start = 0, stop = 100, num = 5)

Результаты:

-------------------------
|0 | 25 | 50 | 75 | 100 |
-------------------------

Теперь в Котлине, как я могу получить тот же результат? Есть ли подобная библиотека?

Ответы [ 3 ]

5 голосов
/ 21 апреля 2019

Это должно работать точно так же, как linspace (не обрабатывая случаи, когда num равно 0 или 1):

fun linspace(start: Int, stop: Int, num: Int) = (start..stop step (stop - start) / (num - 1)).toList()

Используется диапазон start..stop (диапазон в котлине включительно) и функцияstep позволяет нам определить, насколько далеко должны быть шаги в этих диапазонах.

РЕДАКТИРОВАТЬ
Как подсказывает @forpas в комментариях, шаг должен рассчитываться с использованием (stop - start), а нетолько stop.Использование только stop будет работать, только если start было 0.

@ Алексей Романов правильно сказал, что , если вам явно не нужен List в качестве возвращаемого типа, вы должны вернуть IntProgression (он не содержит все элементы в памяти, как список), так какего также Iterable.

Спасибо вам обоим за ваш вклад!

3 голосов
/ 21 апреля 2019

Не совсем то же самое, но он генерирует массив с 5 целыми числами, кратными 25, начиная с 0:

val array = Array(5) { it * 25  }

результат:

[0, 25, 50, 75, 100]

Вы можете создать функцию, имитирующую то, что вам нужно:

fun linspace(start: Int, stop: Int, num: Int) = Array(num) { start + it * ((stop - start) / (num - 1)) }
1 голос
/ 22 апреля 2019

DoubleProgression раньше существовал, но был удален , потому что это вызывает проблемы с округлением;вы можете скопировать исходники из этого коммита в качестве отправной точки, если вам это действительно нужно.Или рассмотрите возможность преобразования его в BigDecimalProgression.Конечно, вам нужно деление, чтобы получить шаг от ваших аргументов, что не точно даже для BigDecimal.

Вы также можете использовать последовательности :

fun linspaceD(start: Double, stop: Double, num: Double): Sequence<Double> {
    val step = (stop - start) / (num - 1)
    return sequence {
        for i in 0 until num yield(start + step*i)
    }
}

Обратите внимание, что это разрешает округление определенным образом, всегда получая значения num, даже если последнее являетсянемного больше чем stop.

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