如何在kotlin中自动生成与numpy类似的数组?

如何在kotlin中自动生成与numpy类似的数组?,kotlin,Kotlin,您好,让我用python演示一下我想在kotlin中实现什么: np.linspace(start=0,stop=100,num=5) 这导致: ------------------------- |0 | 25 | 50 | 75 | 100 | ------------------------- 现在在科特林我怎么能得到同样的结果?是否有类似的库?不完全相同,但它生成一个包含5个整数的数组,即从0开始的25的倍数: val array = Array(5) { it * 25 } 结

您好,让我用python演示一下我想在kotlin中实现什么:

np.linspace(start=0,stop=100,num=5)
这导致:

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

现在在科特林我怎么能得到同样的结果?是否有类似的库?

不完全相同,但它生成一个包含5个整数的数组,即从
0
开始的
25的倍数:

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)) }

这应该与linspace完全相同(num为0或1时不处理案例):

它利用范围
start..stop
(包括kotlin中的一个范围)和功能
step
来定义该范围内的步数

编辑
正如@forpas在评论中建议的那样,应使用
(停止-启动)
计算步骤,而不仅仅是
停止
。仅当
start
0
时,单独使用
stop
才有效

@Alexey Romanov正确地说,除非您明确地需要一个列表作为返回类型,否则您应该返回
IntProgression
(它不像列表那样保存内存中的所有元素),因为它也是
Iterable


谢谢你们两位的意见

DoubleProgression
曾经存在,但因为它会引发舍入问题;如果确实需要,可以从提交中复制源作为起点。或者考虑将其转换为<代码> BigDeimimalAddio/<代码>。当然,您需要除法才能从参数中获得步骤,即使对于
BigDecimal
,这也不精确

您还可以使用:

fun linspaceD(开始:双精度,停止:双精度,数值:双精度):序列{
val步长=(停止-启动)/(数值-1)
返回序列{
对于0中的i,直到num产量(开始+步骤*i)
}
}

请注意,这会以一种特定的方式解决舍入问题,即始终生成
num
值,即使最后一个值略大于
stop

非常感谢您的回答,此函数是否接受小数?例如,从0.5到34.6,这只适用于整数。
range
函数也可以接受十进制,但
step
不接受。@royer迭代浮点数通常是个坏主意,因为它们容易出现舍入错误。该步骤不应该是:
(停止-开始)/(num-1)
?我忘了说的是,
IntProgression
不需要像
List
那样将其元素保存在内存中。非常感谢您的回答,这个函数接受小数吗?例如,从0.5到34.6在lambda
中,它是数组的索引,您可以将它乘以任何数字数据类型。例如:
{it*0.25}
将生成
[0.0,0.25,0.5,0.75,1.0]
一个
数组
。很好的解决方案!感谢您对DoubleProgression的深入了解
fun linspace(start: Int, stop: Int, num: Int) = (start..stop step (stop - start) / (num - 1)).toList()
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)
    }
}