我想构造一个新的向量(float64
),用NaN
填充,长度为N
,然后将它的一部分分配给另一个基于boolean
向量的向量(float64
)。
这可以在python(numpy)中轻松完成,例如:
import numpy as np
N = 5
a = np.empty(N, dtype=float)
a.fill(np.nan)
b = [True, False, True, False, False]
c = [1.1, 5.3]
a[b] = c
# a = [1.1, nan, 5.3, nan, nan]
在Rust中实现这一点的惯用和有效的方法应该是什么?
1条答案
按热度按时间vawmfj5a1#
Rust中并没有真正的唯一惯用的方式。有很多可能的方法。但实际上有几个最佳实践。最重要的一条是:
.iter()
)代替索引操作符([..]
)。索引运算符执行越界检查(因为Rust没有未定义的行为,越界访问将是未定义的行为),因此速度很慢(-ish)。让我向你展示两种实现这一目标的可能方法。
如果您创建一个
NaN
数组,然后对值进行排序,那么同时进行这两个数组会更有效。像这样:(谢谢@Stargateur)说明:
let mut i = c.into_iter()
创建迭代器i
,它将生成c
的所有元素。b.into_iter()
创建一个迭代器,它将产生b
的所有值。.map()
操作将布尔值Map到i.next()
或f64::NAN
,这取决于它们的值。i.next()
插入c
的下一个值。i.next()
是闭包的一部分,这意味着它只在实际需要时才被计算。.collect()
获取所有值并将它们收集到一个向量中(在本例中)。下面是另一个例子,当我们已经有了一个vector并希望在特定位置插入元素时:
原理是类似的,但我们不是
.collect()
ing,而是通过.iter_mut()
对其进行迭代,因此我们可以修改现有数据。