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
引用sentence
或firstWord
,因为它是一个新的、分离的东西。
每个 []
是一个 __getitem__
调用(或 set
在 []=
的情况下)。
[:]
本身什么都不做。在一个小数组中测试自己。
[0][0][0][1:]
等同于 [0,0,0,1:]
(虽然慢一点)。
[0][:][0]
等价于 [0,0]
或者在这个 3d 案例中 [0,0,:]
。从错误消息中应该可以看出这一点。它选择最后一个维度,而不是中间维度。
大多数时候,在做多维数组索引时,使用单操作语法[ , , ,]
。并花更多时间阅读基本的 numpy 文档,尤其是大索引页面
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
引用sentence
或firstWord
,因为它是一个新的、分离的东西。
每个 []
是一个 __getitem__
调用(或 set
在 []=
的情况下)。
[:]
本身什么都不做。在一个小数组中测试自己。
[0][0][0][1:]
等同于 [0,0,0,1:]
(虽然慢一点)。
[0][:][0]
等价于 [0,0]
或者在这个 3d 案例中 [0,0,:]
。从错误消息中应该可以看出这一点。它选择最后一个维度,而不是中间维度。
大多数时候,在做多维数组索引时,使用单操作语法[ , , ,]
。并花更多时间阅读基本的 numpy 文档,尤其是大索引页面