Numpy:用括号和逗号切片有什么区别?

Numpy: What is the difference between slicing with brackets and with comma?

numpy 中的 [x][y][:] 和 [x, y, :] 有什么区别? 在我的示例中,我想将 np.ndarray 分配给另一种方式,一种方式有效,而另一种方式无效。使用相同的索引,所以我真的很想知道为什么。 谢谢

>>> gtfb_fft_hypercube.shape
(187, 42, 96, 1026)
>>> amp_mod_cube.shape
(42, 1025, 187)
>>> gtfb_fft_hypercube[0][0][0][1:] = amp_mod_cube[0][:][0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (187,) into shape (1025,)
>>> gtfb_fft_hypercube[0, 0, 0, 1:] = amp_mod_cube[0, :, 0]
>>> 

完全non-technical解释如下...

当你这样做时:

gtfb_fft_hypercube[0]

你有点“查找并提取” gtfb_fft_hypercube 的第一行,它是一个新的 “thing/entity “ 形状为 (42, 96, 1026)

当你这样做时:

gtfb_fft_hypercube[0][0]

然后您将获取该新事物的第一个元素(通过切片)- 它不再附加到原始 gtfb_fft_hypercube 或成为原始 gtfb_fft_hypercube 的一部分,它只是 [=40= 的切片部分] 东西。


文字可能更简单,但原理是一样的:

sentence = ["The","cat","sat","on","the","mat"]

# Get first word - by looking it up in sentence
firstWord = sentence[0]            # firstWord = "The

# Get first letter of first word
firstLetter = firstWord[0]         # firstLetter = "T"

但是现在我们不能通过firstLetter引用sentencefirstWord,因为它是一个新的、分离的东西。

每个 [] 是一个 __getitem__ 调用(或 set[]= 的情况下)。

[:] 本身什么都不做。在一个小数组中测试自己。

[0][0][0][1:] 等同于 [0,0,0,1:](虽然慢一点)。

[0][:][0] 等价于 [0,0] 或者在这个 3d 案例中 [0,0,:]。从错误消息中应该可以看出这一点。它选择最后一个维度,而不是中间维度。

大多数时候,在做多维数组索引时,使用单操作语法[ , , ,]。并花更多时间阅读基本的 numpy 文档,尤其是大索引页面

https://numpy.org/doc/stable/user/basics.indexing.html