首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用“冒号和逗号”进行切片与使用索引集合不同

为什么使用“冒号和逗号”进行切片与使用索引集合不同
EN

Stack Overflow用户
提问于 2018-05-30 17:26:50
回答 1查看 244关注 0票数 1

为什么使用“冒号和逗号”的切片与使用索引集合的切片不同?

下面是一个我期望产生相同结果的例子,但它并没有:

代码语言:javascript
复制
import numpy as np

a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

print(a[[0,1],[0,1]])
# Output
# [[ 1  2  3]
#  [10 11 12]]

print(a[:,[0,1]])
# Output
# [[[ 1  2  3]
#   [ 4  5  6]]
#  [[ 7  8  9]
#   [10 11 12]]]

为什么它们不是等价的?

EN

回答 1

Stack Overflow用户

发布于 2018-05-30 17:50:29

在第一种情况下,您使用2个相同长度的列表对数组a进行索引,这相当于使用2个相同形状的数组进行索引(请参阅numpy docs on arrays as indices)。

因此,输出是a[0,0] (与a[0,0,:]相同)和a[1,1],它们是索引数组的元素级组合。这将返回一个形状为2、3.2的数组,因为它是索引数组的长度,而3是没有索引的轴。

然而,在第二种情况下,结果是a[:,0] (相当于a[:,0,:])和a[:,1]。因此,在这里,预期的结果是一个数组,其第一和第三维与原始数组相等,第二维等于索引数组的长度2 (这里与第二轴的原始大小相同)。

为了清楚地表明这两个操作显然不同,我们可以尝试假设:和与轴到第三个轴的长度相同的范围相等,这将导致:

代码语言:javascript
复制
print(a[[0,1],[0,1],[0,1,2]])
IndexError                                Traceback (most recent call last)
<ipython-input-8-110de8f5f6d8> in <module>()
----> 1 print(a[[0,1],[0,1],[0,1,2]])

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (2,) (3,) 

这是因为不可能按元素组合索引数组。与之相反,a[:,:,:]将返回整个数组,而a[[0,1],[0,1],[0,2]]返回[ 1 12],正如预期的那样,它是一个长度为2的一维数组,就像索引数组一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50601068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档