Numpy使用None与冒号的数组切片运算结果疑问
Numpy代码运行结果解释
- 第一步:明确初始数组维度
初始定义的A = np.array([0, 1])、B = np.array([0, 1])都是形状为(2,)的一维数组。 - 第二步:
None的作用说明
numpy中None是np.newaxis的简写,作用是给数组新增一个长度为1的维度,新增维度的位置由None在索引中的位置决定:- 执行
B = B[:, None]后,B在第二个维度新增轴,形状从(2,)变为(2, 1) - 比较语句中的
A[None, :]是给A在第一个维度新增轴,形状从(2,)变为(1, 2) - 比较语句中的
B[:, None]是给已经是(2,1)的B在第二个维度新增轴,形状最终变为(2, 1, 1)
- 执行
- 第三步:广播规则下的比较逻辑
numpy中不同形状的数组做运算时会自动触发广播机制,规则如下:- 先给维度更少的数组在最前面补长度为1的维度,直到两个数组维度数一致
- 对应维度的长度要么相等,要么其中一个为1,否则会抛出维度不匹配错误
- 最终运算结果的形状为各维度长度的最大值
本次比较中,A[None, :]是2维数组,会先在最前面补1得到(1, 1, 2)的形状,和形状为(2, 1, 1)的B做广播后,最终输出结果的形状为(2, 1, 2),和你拿到的输出结构完全对应。
- 第四步:逐值比较过程
广播后相当于B的每个元素都会和A的所有元素逐一比较:- 第一个B元素值为0:
0 == 0 → True,0 == 1 → False,得到第一组结果[[ True False]] - 第二个B元素值为1:
1 == 0 → False,1 == 1 → True,得到第二组结果[[False True]]
两组结果拼接就是你看到的最终输出。
- 第一个B元素值为0:
内容的提问来源于stack exchange,提问作者djokovic
相关产品推荐
相关产品推荐

