2024-06-16 10:58:30 发布
网友
有谁能解释一下下面的命令(<---)在pythonnumpy中是如何工作的
<---
r = np.arange(36) r.resize(6,6) r.reshape(36)[::7] # <---
首先,您使用的是NumPy ndarray.reshape,它将给定的数组重新构造为指定的形状。在您的例子中,您将其转换为包含36个元素的一维数组。在
第二,括号内的数字是indexing数组中的某些值。切片为每个维度包含3个值,形式为[number1:number2:number3]。如果您将这些值留空(就像您对数字1和2的情况一样),则会将它们保留为默认值,即number1将为0,number2将为-1(最后一个数组索引),number3将为3:
有一点需要补充的是,reshape()和resize()方法具有相同的功能,它们之间唯一的区别是它们如何影响调用数组对象r:
reshape()
resize()
r
r.resize()
r.reshape()
>>> import numpy as np >>> r = np.arange(36) >>> r.shape (36,) >>> # 1. - `reshape()` returns a new object and keep the `r` - >>> new = r.reshape(6,6) >>> new.shape (6, 6) >>> >>> # 2. - resize changes `r` directly and returns `None` - >>> nothing = r.resize(6,6) >>> type(nothing) <class 'NoneType'> >>> r.shape (6, 6)
您只需逐个运行命令并分析其输出:
创建第一个[0, 35]编号的列表。在
[0, 35]
>>> r = np.arange(36) >>> r array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35])
将列表的形状改为6 x 6数组:
6 x 6
>>> r.resize(6,6) # equivalent to r = r.reshape(6,6) >>> r array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35]])
将向量r重塑为1维向量
>>> tmp = r.reshape(36)
上面的tmp与第一步中的r完全相同
tmp
过滤每个元素
>>> tmp[::7] array([ 0, 7, 14, 21, 28, 35])
切片/索引表示为i:j:k,其中i = from,j = to和{}。因此,5:10:2将意味着从第5元素到第10元素的,每2步给我元素。如果i不存在,则假定它从数组的开头开始。如果j不存在,则假定它一直存在到数组的末尾。如果k不存在,则假定其步长为1(范围内的所有元素)。
i:j:k
i = from
j = to
5:10:2
i
j
k
有了以上所有内容,您可以在一行中重写示例:
>>> np.arange(36)[::7]
或者如果您已经有了r,它是N维的:
>>> r.ravel()[::7]
这里ravel将返回r(首选reshape(36))的1维视图。在
ravel
reshape(36)
如果您想了解有关切片的更多信息,请参阅numpy documentation。在
首先,您使用的是NumPy ndarray.reshape,它将给定的数组重新构造为指定的形状。在您的例子中,您将其转换为包含36个元素的一维数组。在
第二,括号内的数字是indexing数组中的某些值。切片为每个维度包含3个值,形式为[number1:number2:number3]。如果您将这些值留空(就像您对数字1和2的情况一样),则会将它们保留为默认值,即number1将为0,number2将为-1(最后一个数组索引),number3将为3:
有一点需要补充的是,
reshape()
和resize()
方法具有相同的功能,它们之间唯一的区别是它们如何影响调用数组对象r
:r.resize()
没有返回。它直接改变调用数组对象r
的形状。在r.reshape()
返回一个新的重塑数组对象。并保持原始r
不变。在您只需逐个运行命令并分析其输出:
创建第一个
[0, 35]
编号的列表。在将列表的形状改为
6 x 6
数组:将向量
r
重塑为1维向量上面的
tmp
与第一步中的r
完全相同过滤每个元素
切片/索引表示为}。因此,
i:j:k
,其中i = from
,j = to
和{5:10:2
将意味着从第5元素到第10元素的,每2步给我元素。如果i
不存在,则假定它从数组的开头开始。如果j
不存在,则假定它一直存在到数组的末尾。如果k
不存在,则假定其步长为1(范围内的所有元素)。有了以上所有内容,您可以在一行中重写示例:
或者如果您已经有了
r
,它是N维的:这里
ravel
将返回r
(首选reshape(36)
)的1维视图。在如果您想了解有关切片的更多信息,请参阅numpy documentation。在
相关问题 更多 >
编程相关推荐