为何numpy.ravel操作后得到二维数组?求解释及[:]的作用
问题解答
为什么看起来ravel()返回二维数组?
你看到的最终结果是二维数组,并不是因为ravel()返回了二维数组——实际上np.ravel()确实返回的是原数组的一维视图。问题出在代码逻辑上:
matrix.ravel()生成了原3x3二维数组的一维视图(形状为(9,))- 你通过
matrix.ravel()[:] = my_list,是通过这个一维视图修改原二维数组matrix的元素 - 最后函数返回的是原二维数组
matrix,所以打印出来的是二维结构,而非ravel()返回的一维对象。
如果直接打印matrix.ravel(),你会看到它确实是一维的:
def jumbo(): import numpy as np my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] matrix = np.zeros((3,3)) raveled = matrix.ravel() raveled[:] = my_list print("raveled result:", raveled) # 输出一维数组 return matrix
切片符[:]的作用
这里的[:]是numpy数组的全切片,核心作用有两个:
- 获取数组的完整视图:对于numpy数组,
arr[:]会返回原数组的视图(而非副本),修改这个视图的元素会直接同步到原数组上。 - 支持赋值操作:如果直接写
matrix.ravel() = my_list会触发语法错误,因为不能直接给函数返回的对象赋值。而matrix.ravel()[:]相当于定位了这个一维视图的所有元素位置,此时赋值操作会把my_list的元素逐个写入对应位置,最终修改原二维数组matrix。
简单来说,[:]在这里就是让你能通过一维视图,把列表的值批量写入原二维数组的所有元素中。
内容的提问来源于stack exchange,提问作者Ubuntu-on-Mac
相关产品推荐
相关产品推荐

