请问,有人能解释一下这三种索引操作之间的区别吗:
- 索引(indexing) - 切片(slicing) - 迭代(iteration)
我不明白的是:
- 为什么操作2无法正常工作,而操作1可以正常工作? - 为什么操作3可以正常工作,但返回了我期望的转置结果(即操作1的结果)?
根据numpy参考文献:
如果索引数组的形状不相同,则会尝试将它们广播到相同的形状。如果它们不能广播到相同的形状,则会引发异常。
所以这意味着我不能做:
我遇到了这个错误:
IndexError: 形状不匹配:无法将形状为 (3,) 和 (1,2) 的数组广播在一起进行索引。
- 索引(indexing) - 切片(slicing) - 迭代(iteration)
y = np.arange(35).reshape(5,7)
# Operation 1
y[np.array([0,2,4]),1:3]
# Operation 2
y[np.array([0,2,4]), np.array([[1,2]])]
# Operation 3
y[np.array([0,2,4]), np.array([[1],[2]])]
我不明白的是:
- 为什么操作2无法正常工作,而操作1可以正常工作? - 为什么操作3可以正常工作,但返回了我期望的转置结果(即操作1的结果)?
根据numpy参考文献:
如果索引数组的形状不相同,则会尝试将它们广播到相同的形状。如果它们不能广播到相同的形状,则会引发异常。
所以这意味着我不能做:
y[np.array([0,2,4]), np.array([1,2])]
但是NumPy参考文档还提到了操作1:
实际上,切片会被转换为一个索引数组 np.array([[1,2]])(形状为(1,2)),然后与索引数组进行广播,以产生形状为(3,2)的结果数组。
那么为什么我不能这样做:
y[np.array([0,2,4]), np.array([[1,2]])]
我遇到了这个错误:
IndexError: 形状不匹配:无法将形状为 (3,) 和 (1,2) 的数组广播在一起进行索引。