任何人都可以解释下面的命令(<---
)如何在python numpy中运行
r = np.arange(36)
r.resize(6,6)
r.reshape(36)[::7] # <---
答案 0 :(得分:2)
您只需逐个运行命令并分析其输出:
创建第一个[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
数组:
>>> 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
完全相同
过滤每个7
元素
>>> tmp[::7]
array([ 0, 7, 14, 21, 28, 35])
切片/索引表示为i:j:k
,其中i = from
,j = to
和k = step
。因此,5:10:2
意味着从元素5到10的,每两步给我元素。如果i
不存在,则假定它来自数组的开头。如果j
不存在,则假定直到数组结束。如果k
不存在,则假定步长为1(范围内的所有元素)。
综上所述,您可以在一行中将您的示例重写为:
>>> np.arange(36)[::7]
或者如果你已经有r
,那就是N维:
>>> r.ravel()[::7]
此处ravel
将返回r
的一维视图(首选reshape(36)
)。
如果您想了解有关切片的更多信息,请参阅numpy documentation。
答案 1 :(得分:1)
首先,您正在使用NumPy ndarray.reshape,它将给定数组重建为指定的形状。在您的情况下,您将它转换为具有36个元素的1维数组。
其次,使用括号之间的数字,数组中的indexing值是。切片包含每个维度的3个值,形式为[number1:number2:number3]。如果将值保留为空(如数字1和2的情况),则将它们保留为默认值,即number1为0,number2为-1(最后一个数组索引),number3为3:
答案 2 :(得分:0)
要添加一点,reshape()
和resize()
方法都具有相同的功能,它们之间唯一的区别是它们如何影响调用数组对象r
:
r.resize()
没有回报。它直接改变了调用数组对象r
的形状。r.reshape()
返回一个新的重新整形的数组对象。并保留原始r
不变。>>> 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)