如何在kotlin中自动生成与numpy类似的数组?
您好,让我用python演示一下我想在kotlin中实现什么:如何在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 } 结
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)
}
}