[英]numpy.ravel giving 2D array - can anyone explain?
我遇到了一些代码,其中使用 numpy.ravel() 会产生一个二维数组 - 我看过文档,它说 ravel() 返回一个一维数组(参见https://numpy .org/doc/stable/reference/generated/numpy.ravel.html )。
这是一个显示这一点的代码片段:
def jumbo():
import numpy as np
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.zeros((3,3))
matrix.ravel()[:] = my_list
return matrix
new_matrix = jumbo()
print(f"new matrix is:\n{new_matrix}")
我想我要问的部分内容是范围说明符 [:] 的功能是什么?
ravel
返回 numpy 数组的视图,因此当你这样做时:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.zeros((3,3))
matrix.ravel()[:] = my_list
您正在使用视图作为暂时将matrix
索引为 1D 的一种方式。
这使得这里可以设置一维列表中的值,但底层数组仍然是二维的。
matrix.ravel()[:]
用于启用设置数据。 您还可以使用 2 个步骤:
view = matrix.ravel()
view[:] = my_list
输出:
array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
正如@Stef 在评论中很好地指出的那样,这个“技巧”只适用于 C-contiguous arrays ,这意味着你不能使用ravel('F')
:
示范:
view1 = matrix.ravel()
view2 = matrix.ravel('F') # actually not a view!
id(matrix)
# 140406991308816
id(view1.base)
# 140406991308816
id(view2.base)
# 9497104 # different id, we have a copy!
您所做的是在“raveled”矩阵中分配值,而实际上没有保存 ravel 操作。
matrix = np.empty((3,3)) # created empty matrix
matrix.ravel() # created 1d view of matrix
matrix.ravel()[:] # indexing every element of matrix to make assignment possible (matrix is still in (3,3) shape)
matrix.ravel()[:] = my_list # assigned values.
如果你想返回 1D 然后像这样返回 raveled 数组
def jumbo():
import numpy as np
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.empty((3,3))
matrix.ravel()[:] = my_list
return matrix.ravel()
new_matrix = jumbo()
print(f"new matrix is:\n{new_matrix}")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.