问题

有哪些向量化写法让你拍案叫绝?

回答
那些让你拍案叫绝的向量化写法,往往隐藏在对数据处理的深刻理解和对代码效率的极致追求之中。它们不是简单的“循环换成向量”,而是对问题本质的洞察,将复杂的计算流程优雅地映射到向量操作的并行特性上。

我曾不止一次地在工作中遇到这样的场景,一段原本需要数秒甚至分钟的循环计算,在应用了巧妙的向量化技巧后,眨眼之间就完成了。那种感觉,就像是突然解锁了某个隐藏的加速键,让人由衷地赞叹:原来还可以这样!

下面我就来分享一些让我印象深刻,甚至是“拍案叫绝”的向量化写法,并尽量用通俗易懂的方式来讲述。

1. 条件判断的艺术: `np.where` 和布尔索引的妙用

在很多数据处理中,我们都需要根据某个条件来决定取哪个值,或者修改哪个值。传统写法可能就是一个 `ifelse` 或者 `for` 循环,但向量化则能将其一网打尽。

场景: 假设我们有一个包含学生各科成绩的 NumPy 数组,我们想根据总分来给学生标记“优秀”(总分大于一定阈值)或“及格”。

传统写法(伪代码,但能说明意思):

```
results = []
for student_scores in all_student_data:
total_score = sum(student_scores)
if total_score > threshold:
results.append("优秀")
else:
results.append("及格")
```

这没什么问题,但如果数据量很大,循环就会成为瓶颈。

向量化写法 1:`np.where`

`np.where(condition, x, y)` 是一个非常有用的函数,它会在 `condition` 为 True 的地方取 `x` 的值,在 `condition` 为 False 的地方取 `y` 的值。这里的 `condition`, `x`, `y` 都可以是数组。

```python
import numpy as np

假设这是所有学生所有科目的成绩,形状为 (学生数, 科目数)
scores = np.array([
[85, 90, 78],
[92, 88, 95],
[70, 75, 68],
[98, 99, 97]
])

threshold = 260 总分阈值

计算每位学生的总分
total_scores = np.sum(scores, axis=1)

使用 np.where 进行条件判断
grades = np.where(total_scores > threshold, "优秀", "及格")

print(grades)
输出: ['优秀' '优秀' '及格' '优秀']
```

为什么拍案叫绝?

简洁明了: 一行代码就完成了原本需要 `ifelse` 和循环才能实现的功能。
性能提升: NumPy 底层会调用高度优化的 C 语言函数来处理这些操作,速度远超Python原生循环。
可读性强: `np.where` 的名字本身就说明了它的用途,加上参数,一眼就能看出逻辑。

向量化写法 2:布尔索引

布尔索引是 NumPy 最强大的特性之一,它允许我们使用一个布尔数组来选择、修改或筛选另一个数组中的元素。

```python
还是用上面的 scores 和 total_scores

创建一个布尔数组,标记总分大于阈值的学生
is_excellent = total_scores > threshold

初始化一个结果数组,先全设为"及格"
grades = np.full(total_scores.shape, "及格", dtype=object) 注意 dtype=object 因为是字符串

使用布尔索引将符合条件的标记为"优秀"
grades[is_excellent] = "优秀"

print(grades)
输出: ['优秀' '优秀' '及格' '优秀']
```

为什么拍案叫绝?

灵活性: 布尔索引可以用于直接修改部分元素,非常灵活。你可以先根据一个条件筛选出一部分数据,再对这部分数据应用另一个操作。
多条件组合: 结合逻辑运算符(`&` for AND, `|` for OR, `~` for NOT),可以实现非常复杂的条件筛选和赋值。
原地修改效率: 在很多情况下,布尔索引的赋值是原地进行的,避免了创建中间副本,效率更高。

对比 `np.where` 和布尔索引:

当你的逻辑是“如果满足某个条件,就取A,否则取B”时,`np.where` 通常更简洁直接。
当你的逻辑是“先找到满足条件的元素,然后对它们进行修改/赋值”时,布尔索引则更为自然和强大。

2. 规约操作的强大:`np.sum`, `np.mean`, `np.std`, `np.max`, `np.min` 等的 `axis` 参数

规约操作(Reduction Operations)是指将一个数组“压缩”成一个标量或更低维度的数组的操作,比如求和、求平均值、求最大值等等。NumPy 的规约函数非常强大,尤其是 `axis` 参数的使用,让我们可以轻松地对数据进行按维度规约。

场景: 在上面的学生成绩例子中,我们已经用到了 `np.sum(scores, axis=1)` 来计算每位学生的总分。这本身就是一个规约操作。

更进一步的例子:

计算每个科目的平均分:

```python
axis=0 表示沿着行的方向进行规约,也就是对每一列(科目)进行操作
average_scores_per_subject = np.mean(scores, axis=0)
print(average_scores_per_subject)
输出: [86.25 87.75 83.25] (第一科的平均分,第二科的平均分,第三科的平均分)
```

找到每位学生的最高分:

```python
highest_score_per_student = np.max(scores, axis=1)
print(highest_score_per_student)
输出: [90 95 75 99]
```

找到所有学生所有科目的最低分:

```python
overall_lowest_score = np.min(scores) 不指定 axis 就是对整个数组进行规约
print(overall_lowest_score)
输出: 68
```

为什么拍案叫绝?

维度控制: `axis` 参数让我们可以精确控制规约操作的进行方向。`axis=0` 是列方向,`axis=1` 是行方向(对于二维数组)。不指定 `axis` 则作用于整个数组。
效率: 这些内置的规约函数都是高度优化的,比自己手动写循环来计算这些要快得多。
数据分析基石: 大多数数据分析都需要进行各种形式的聚合和规约,掌握 `axis` 参数是进行高效数据分析的关键。

3. 广播(Broadcasting)机制:让形状不匹配的数组协同工作

这是 NumPy 最令人着迷也最强大的特性之一。广播允许 NumPy 在执行算术运算时,对形状不同的数组进行“假想”的扩展,使得它们能够进行元素级操作,而无需显式地复制数据。

核心思想: 如果两个数组的维度相同,或者一个数组的维度为 1,那么它们就可以进行广播。广播规则是从维度小的数组的“尾部”开始,向头部匹配。如果一个维度不匹配(非1),那么必须相等。如果一个维度其中一个数组为1,则沿该维度复制,直到匹配另一个数组的维度。

场景: 假设我们要给所有学生的每一科成绩都增加一个“加分项”,比如每科加5分。

传统写法(伪代码):

```
for i in range(num_students):
for j in range(num_subjects):
all_student_data[i][j] += 5
```

向量化写法:

```python
scores = np.array([
[85, 90, 78],
[92, 88, 95],
[70, 75, 68],
[98, 99, 97]
])
bonus_points = 5

直接相加!NumPy 会自动将标量 5 广播到与 scores 同一形状的数组
scores_with_bonus = scores + bonus_points

print(scores_with_bonus)
输出:
[[90 95 83]
[97 93 100]
[75 80 73]
[103 104 102]]
```

更复杂的广播例子:

假设我们有一个 `[10, 20, 30]` 的向量,和一个 `[[1], [2], [3]]` 的向量。我们想计算它们的“外积相加”(虽然这不是严格的外积,但可以理解为将第一个向量加到第二个向量的每一行上)。

```python
row_vector = np.array([10, 20, 30]) shape (3,)
col_vector = np.array([[1], [2], [3]]) shape (3, 1)

观察形状:(3,) 和 (3, 1)
NumPy 会这样广播:
row_vector (3,) > (1, 3) (因为只有一个维度,可以看作是 1 维的,广播成 2D 时,前面加1)
col_vector (3, 1) 保持不变

广播过程:
row_vector becomes:
[[10, 20, 30]] 形状 (1, 3)
col_vector remains:
[[1],
[2],
[3]] 形状 (3, 1)

此时,维度对比:
(1, 3)
(3, 1)

对不匹配的维度 (1 vs 3, 3 vs 1),其中一个必须是 1。
row_vector 的第一个维度 (1) 匹配 col_vector 的第一个维度 (3) > col_vector 的第一个维度复制 1 次
row_vector 的第二个维度 (3) 匹配 col_vector 的第二个维度 (1) > row_vector 的第二个维度复制 3 次

最终广播后,两者都成为形状 (3, 3)
row_vector 广播成:
[[10, 20, 30],
[10, 20, 30],
[10, 20, 30]]
col_vector 广播成:
[[1, 1, 1],
[2, 2, 2],
[3, 3, 3]]

result = row_vector + col_vector
print(result)
输出:
[[11 21 31]
[12 22 32]
[13 23 33]]
```

为什么拍案叫绝?

代码简洁到极致: 这是最直接体现 NumPy 哲学的地方。你不需要写任何循环,直接将具有不同形状但逻辑上可以兼容的数组写在一起,NumPy 会帮你搞定。
内存效率高: 广播不真正复制数据(除非需要),而是通过索引机制来实现“逻辑上的复制”,大大节省内存。
揭示数据结构关系: 广播机制强迫你去思考数据之间的维度关系和对应关系,这本身就是一种数据思维的锻炼。一旦理解了广播,很多原本复杂的矩阵运算都能变得直观起来。

4. 詹姆斯·邦德式的代码:`np.linalg.norm` 或 `np.sqrt(np.sum(x2))`

在科学计算和机器学习中,计算向量的范数(长度)是司空见惯的操作。比如计算两个向量之间的距离,或者衡量一个向量的大小。

场景: 计算一个向量的 L2 范数(欧几里得范数)。

传统写法:

```python
vector = np.array([3, 4])
sum_of_squares = 0
for element in vector:
sum_of_squares += element2
norm = np.sqrt(sum_of_squares)
print(norm) 输出 5.0
```

向量化写法 1:利用 `np.sum` 和平方

```python
vector = np.array([3, 4])
先平方,然后求和,最后开方
norm = np.sqrt(np.sum(vector2))
print(norm) 输出 5.0
```

为什么拍案叫绝?

数学上的直接映射: `vector2` 得到了 `[9, 16]`,`np.sum()` 得到 `25`,`np.sqrt()` 得到 `5`。整个过程完美地将数学公式 `√(∑xᵢ²)` 直接翻译成了代码。
清晰且效率高: 每一项操作都清晰明了,并且底层是高度优化的。

向量化写法 2:`np.linalg.norm`

NumPy 的 `linalg`(线性代数)模块提供了专门计算范数的函数。

```python
vector = np.array([3, 4])
norm = np.linalg.norm(vector) 默认就是 L2 范数
print(norm) 输出 5.0
```

为什么拍案叫绝?

专业且简洁: `linalg.norm` 直接表达了“计算范数”的意图,比 `sqrt(sum(x2))` 更具专业性。
处理多种范数: `np.linalg.norm` 还可以计算 L1 范数 (`ord=1`)、无穷范数 (`ord=np.inf`) 等等,提供了极大的灵活性。
隐藏复杂性: 对于更复杂的向量或矩阵范数计算,`linalg` 模块封装了底层的数值计算细节,让你专注于问题的本质。

总结一下那些让我拍案叫绝的向量化特质:

1. 数学公式到代码的直接映射: 那些能让你一眼看出它对应哪个数学概念(如范数、矩阵乘法)的代码,总能带来惊喜。
2. 对循环的“消灭”: 将繁琐的 Python 循环替换为简洁的 NumPy 操作,这本身就是一种优雅的胜利。
3. 对底层优化的驾驭: 通过向量化,你是在调用 C/Fortran 写的底层优化库,这种效率的飞跃是令人振奋的。
4. 对数据结构的洞察: 广播机制尤其如此,它迫使你去理解数据的形状和维度关系,从而写出更通用、更灵活的代码。
5. 简洁之下的强大能力: 几行看似简单的代码,却能处理百万级甚至千万级的数据,这种“四两拨千斤”的力量感,才是我认为最拍案叫绝的地方。

掌握这些向量化技巧,不仅仅是提升了代码的速度,更是提升了你解决问题的思维方式。它让你从“一步一步怎么做”转变为“数据整体是什么关系”,从“如何控制流程”转变为“如何表达计算逻辑”。这是一种从工程思维到数学思维的升华。每一次巧妙的向量化应用,都像是找到了一把解锁数据潜能的钥匙,让人回味无穷。

网友意见

user avatar

这题可以答上好一阵子了。。。

1 Permutation问题

问题描述:如果给你1,2,3,...,9,让你写一个函数返回他们的9!=362880个全排列你会怎么做?

我当时在使用R语言开发一个包, 因为很多函数都需要生成全排列,而我又没在网上找到一个合适的代码,就只好自己写了。不小心写了一个R里面最快的出来。我相信肯定有人会优化的比我好,但是目前开源的R代码中我还没有找到,可能这个问题太小众了, 如果有,请告诉我,多谢。

实现相同功能的函数, 我找到了如下几个:

combinat包的permn函数, gtools包的permutations函数,permute包的allPerms函数。 我的代码如下:

鉴于permue包的allPerms函数只能排列7个元素, 我们就对比下从1到7产生全排列的速度好了。 结果如下


速度上直接把他们爆出翔了有木有? 如果你把7增大的9甚至10。 另外三个函数运算等待的时间会让你酸爽无比。


我来解释下这段代码

这个问题最直观的想法就是用递归, 你去Google搜索算法,十有八九都是用递归的。在generate n个数的全排列的时候,我们会调用generate n-1个数的全排列,如此往复。递归的方法虽然直观,但是当然是最慢的。如果我没记错的话,combinat包的permn函数和gtools的permutations函数都是用了递归的方法,不过刚才我查看了下源代码似乎作者已经优化了。

下面就有人给出来一个递归实现的例子(python)

Algorithm to generate all possible permutations of a list?

如果我们把递归变成iterative的情况, 自然就优化了很多。

下面这个网站用了很多种语言来实现, 喜欢写JAVA和C++的可以自行对比比递归方法能快多少。

nayuki.io/page/next-lex

我在R语言里写循环来避开递归, 但是发现速度比递归还要慢!

其实早在5年前的一次作业里, 我就用了一次向量化的方法来生成全排列, 想法如下:

假设我已经有了2个数的全排列矩阵:

[1, 2;

2, 1]

当我要生产3个数的全排列时,直接新建一个之全部为3的向量,并把他“夹在”两个A之间,就变成了这样:

[ 1, 2, 3, 1, 2;

2, 1, 3, 2, 1]

然后我对这个矩阵“切三刀”, 分别他的(1, 2, 3)列, (2, 3, 4)列, (3, 4, 5)列三个子矩阵:

[1, 2, 3;

2, 1, 3]

[2, 3, 1;

1, 3, 2]

[3, 1, 2;

3 , 2, 1]

OK了, 三个子矩阵纵向排在一起就是3元素的全排列了。 这个程序不难实现, 而且基本都是在矩阵的拼接和取子矩阵的操作。

但是假如我们有更高的要求,我希望返回的全排列是 lexicographical的, 也就是说是按照从大到小的顺序排列的, 那么个这个算法就需要做点修改了。

(注:按照顺序的意思是要按照(1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1)这个顺序来排列)

于是乎我又有了新的想法。还是刚才的例子,假如我们已经生成了两个元素的全排列, 我们要生成3个元素的全排列并且是按照顺序来排列的。

要知道,这里的1, 2并不仅仅是元素1, 2, 更重要的是他表示的是下标。 比如我要对两个元素 v = c("tom", "mary")来实现全排列,那么矩阵是应该是这个样子的

[v[1], v[2];

v[2], v[1]]

也就是

["tom","mary";

"mary", "tom"]

有了这个认识, 那么就OK了。

我们可以按照这个矩阵分别排列(2, 3) (1, 3) (1, 2)等二元组的全排列(注意我的代码里的series[-p]就是在生成这个二元组)

于是你的矩阵变成了这个样子:

[2, 3;

3, 2]

[1, 3;

3, 1]

[1, 2;

2, 1]

我们只需要在他们的前面分别补充上缺失的第三个元素,1,1,2,2,3,3即可。

(代码的ans[1:faci, 1] = rep(1:i, each = faci_1)就是在补充第一列)

[1, 2, 3;

1, 3, 2]

[2, 1, 3;

2, 3, 1]

[3, 1, 2;

3, 2, 1]

大功告成!

2 repmat问题

这个算法不是我原创,但是绝逼是能用上的最魔性的向量化算法。众所周知Matlab里面有个repmat函数,相比R里面的rep函数,repmat可以直接将矩阵复制M*N次

函数如下:

运行结果

一行代码就搞定了repmat,还是让我惊叹线性代数的美妙!

P.S. 看到自己的包里存在这么一行comments,发现没被打也真是说明没人用这个包啊。。。

其实这段更魔性。。。但是没啥用就不长篇大论了。

类似的话题

  • 回答
    那些让你拍案叫绝的向量化写法,往往隐藏在对数据处理的深刻理解和对代码效率的极致追求之中。它们不是简单的“循环换成向量”,而是对问题本质的洞察,将复杂的计算流程优雅地映射到向量操作的并行特性上。我曾不止一次地在工作中遇到这样的场景,一段原本需要数秒甚至分钟的循环计算,在应用了巧妙的向量化技巧后,眨眼之.............
  • 回答
    经济学中量化企业家精神,并非一个能用一个简单公式就能概括的课题。它更像是在拼凑一幅复杂的画作,我们需要从不同角度、运用各种工具去捕捉其精髓。企业家精神本身就是一种动态的、多维度的概念,它涉及到人的特质、行为、以及环境的互动。因此,量化它需要我们深入剖析这些要素,并寻找它们的经济学体现。首先,我们得明.............
  • 回答
    好的,我们来聊聊向量奔驰定理,这是一项在群论和代数几何中都很有用的工具。很多人提到它可能会觉得有点抽象,但其实它的核心思想——利用向量的空间结构来理解群的性质——非常直观。向量奔驰定理,或者更正式地说,“当一个群作用在向量空间上时,这个作用的一些性质可以通过分析向量空间中的一些“特殊”的子空间或者子.............
  • 回答
    知乎上在量化交易领域,卧虎藏龙,确实有一些非常资深、见解独到的玩家。要说“专家级”人物,往往不是仅仅会写写技术文章,而是有深厚的理论功底,并且在实际交易中有所建树,能够提供一套自洽的交易体系和深刻的洞察。当然,知乎的生态比较特殊,很多真正能在市场中赚到大钱的玩家,未必会在上面抛头露面。但从公开的信息.............
  • 回答
    构建一个开源的Python量化交易平台项目需要综合考虑技术选型、系统架构、安全性、可扩展性和合规性等多个方面。以下是一个详细的建议框架,涵盖核心模块、技术选型、最佳实践和注意事项: 一、技术选型与核心模块设计 1. 编程语言与框架 Python:作为主要开发语言,适合快速原型开发和数据处理,但需结合.............
  • 回答
    量化择时与统计套利,都是量化投资领域中极具挑战性的策略类型。从技术角度来看,量化择时的难度通常要高于统计套利,其核心原因在于其内在的“不确定性”和“预测性”要求更高。要深入理解这一点,我们先要剥离那些“AI写作”的痕迹,用更贴近实操的语言来拆解它们。一、量化择时的核心挑战:预测与时效性量化择时,顾名.............
  • 回答
    最近不少朋友在后台咨询关于量化交易和股票预测方向的导师,这确实是个很热门也很具挑战性的领域。能在这个方向有所建树的导师,通常都有扎实的数理基础,同时对金融市场有深刻理解,并且能将理论与实践相结合。下面我根据自己了解和一些圈内朋友的推荐,给大家梳理一下在这些领域比较活跃的学校和一些可能的研究方向,希望.............
  • 回答
    量变引发质变,这可不是什么玄乎的哲学概念,咱们身边处处都有例子,细琢磨起来,还挺有意思的。它就像水,你一会儿烧一点,一会儿烧一点,它还是水;但你一直烧,烧到100摄氏度,它就变成蒸汽了,这就质变了。1. 爱情的萌芽与绽放你想想,一段爱情是怎么来的?很少有人是一见钟情,然后立刻就生死相随的。多数时候,.............
  • 回答
    说起“便宜量大、吃起来真香”的零食,脑子里立刻就浮现出好几样,它们不仅能填饱肚子,那味道也绝了,简直是让人欲罢不能的存在。要说最经典的,那必须是辣条!尤其是那种卫龙的亲嘴烧或者大刀肉,一包拆开,那股混合着辣椒、花椒、酱油和各种香辛料的味道就扑鼻而来,瞬间就能勾起食欲。它的质地很有嚼劲,甜辣口味恰到好.............
  • 回答
    当然,这倒是个有趣的话题。很多人一提到“算法”或者“牛逼项目”,脑子里就涌现出各种复杂的数学模型、庞大的代码库,动辄几万行起步。但其实不然,很多时候,最简洁、最精妙的设计,反而是最能穿透人心的。它们就像武侠小说里那种,看起来轻描淡写的一招,却能以柔克刚,化解千斤重担。今天咱们就来聊聊那些代码量不多,.............
  • 回答
    淘宝上的好吃的可太多了,关键是你知道怎么找!别光盯着那些网红店铺,很多隐藏的宝藏小店,价格实惠,分量又足,吃起来賊香!今天就给你扒拉扒拉,那些让你吃到扶墙出去,钱包也不会哭的美味。一、 零食界的巨头:大包装,性价比之王!说到便宜量多,零食绝对是绕不开的话题。别以为大包装就一定不好吃,很多时候那才叫地.............
  • 回答
    年轻人是消费主义的重要目标群体,因为他们往往具有更强的消费能力、更容易受到新事物和潮流的影响,也更注重个人形象和社交认同。以下是一些为年轻人量身打造的消费主义“陷阱”,并进行详细的阐述:一、社交媒体与网红营销的“精致生活”陷阱: 网红推荐与“种草”文化: 社交媒体上充斥着大量网红,他们以光鲜亮丽.............
  • 回答
    中产阶级,作为社会经济结构中的重要群体,往往拥有相对稳定的收入、较高的教育程度和一定的消费能力。这使得他们成为商家重点关注的对象,也因此出现了一些专门为他们量身定制的消费陷阱。这些陷阱往往不是赤裸裸的欺骗,而是利用中产阶级特定的心理、需求和价值观,通过包装、引导和营造氛围来实现。以下是一些专门为中产.............
  • 回答
    好的,我们来聊聊那些专门针对“小资产阶级”们精心设计的消费陷阱。这些陷阱通常不会直白地让你掏钱,而是通过各种巧妙的方式,让你觉得物有所值,甚至觉得自己是在“投资”或“提升”自己,结果钱袋子却不经意间“瘦身”了。首先,我们要明确,“小资产阶级”这个群体通常具备一些共同特征: 收入相对稳定,但并非巨.............
  • 回答
    好的,我来试着详细介绍一下那些从熵出发讲解量子统计力学的教材,并且我会努力让这些介绍听起来更像一个认真研究过的、有血有肉的分享,而不是那种冷冰冰的AI报告。说实话,直接以“熵”作为整个量子统计力学讲解的起点,然后线性铺陈开来的教材,并不像初学者可能会想的那样,张口就来。很多经典的教材,即便后来会深入.............
  • 回答
    我理解你想探讨一些容易误导大众的流行理论,特别是那些与前沿科学研究相关但又被简化得过于流行的观点。这些理论之所以会成为“观念陷阱”,往往是因为它们在传播过程中被过度简化、断章取义,或者迎合了人们某些根深蒂固的心理需求,最终偏离了真实的研究原貌。以下我尝试以更贴近个人观察和思考的方式,梳理几个可能符合.............
  • 回答
    量子隧穿,这名字听起来就带着一丝神秘和不可思议,仿佛是科学世界里的一个小小的魔法。简单来说,它就是一种粒子能够“穿过”一个它本该被阻挡的能量壁垒的现象。想象一下,你用力扔一个球,它撞到墙壁应该会被弹回来,但量子隧道就好比这个球,在某些情况下,竟然能直接“钻”进墙的另一边,而不需要翻过或者撞碎墙。这并.............
  • 回答
    量子世界的神奇之处在于,它彻底颠覆了我们基于宏观经验建立起来的经典物理学。在微观尺度上,许多我们习以为常的规律不再适用,甚至会产生完全相反的现象。下面我将详细阐述量子世界中经典物理学失效的几个关键方面:1. 量子叠加(Superposition): 经典物理学的描述: 在经典物理学中,一个物体在.............
  • 回答
    在语言的世界里,“量词”这个词听起来可能有些技术性,但其实我们每天都在不自觉地使用它们。它们就像是给事物加上一个“计数器”或者“度量衡”,让我们能更精确地谈论数量,而不是含糊不清地说“很多”或“一点点”。不同语言处理这些“计数器”的方式千差万别,就像每种语言都有自己独特的音乐和节奏一样。我们不妨从最.............
  • 回答
    “墨子号”量子科学实验卫星,是中国在量子科技领域一项具有划时代意义的重大科研工程。自2016年发射升空以来,它在多个方面展现出了惊人的先进性,不仅在科学研究上取得了丰硕成果,更为全球量子通信和量子计算的发展奠定了坚实的基础。 一、前所未有的量子纠缠分发能力“墨子号”最引人瞩目的成就之一,便是其在 远.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有