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

4
什么是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]
>>> 
2个回答

3
每个[]都是一个__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

2
完全非技术性的解释如下...
当你执行以下操作时:
gtfb_fft_hypercube[0]

您已经提取了gtfb_fft_hypercube的第一行,并且它是一个形状为(42, 96, 1026)的新实体。

当您执行以下操作时:

gtfb_fft_hypercube[0][0]

你现在正在获取新事物的第一个元素(通过切片)- 它不再附加或是原有的 gtfb_fft_hypercube 的一部分,它只是从类似于列表的东西中切出来的一部分。


用文字可能更容易理解,但原理是相同的:

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,因为它是一个新的、分离的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接