为什么这个数组重塑例程在函数外工作而不是在函数内?
Why does this array-reshaping routine work outside of a function but not inside of a function?
我正在尝试将列表转换为具有指定列数的 numpy 数组。我可以让代码在函数外工作,如下所示:
import numpy as np
ls = np.linspace(1,100,100) # Data Sample
ls = np.array(ls) # list --> array
# resize | outside function
ls.resize(ls.shape[0]//2,2)
print(ls)
>> [[ 1. 2.]
[ 3. 4.]
.
.
.
[ 97. 98.]
[ 99. 100.]]
我不明白在尝试将例程放入函数中时出现的错误。我的尝试如下:
# resize | inside function
def shapeshift(mylist, num_col):
num_col = int(num_col)
return mylist.resize(mylist.shape[0]//num_col,num_col)
ls = shapeshift(ls,2)
print(ls)
>> None
我想以这种方式定义原始函数,因为我想要另一个函数,由相同的输入和第三个输入组成,用于在提取值时遍历行,为每个遍历行调用这个原始函数。
In [402]: ls = np.linspace(1,100,10)
In [403]: ls
Out[403]: array([ 1., 12., 23., 34., 45., 56., 67., 78., 89., 100.])
In [404]: ls.shape
Out[404]: (10,)
无需在array
中再次换行;已经是一个了:
In [405]: np.array(ls)
Out[405]: array([ 1., 12., 23., 34., 45., 56., 67., 78., 89., 100.])
resize
就地操作。它returns什么都没有(或None)
In [406]: ls.resize(ls.shape[0]//2,2)
In [407]: ls
Out[407]:
array([[ 1., 12.],
[ 23., 34.],
[ 45., 56.],
[ 67., 78.],
[ 89., 100.]])
In [408]: ls.shape
Out[408]: (5, 2)
有了这个 resize
你就不会改变元素的数量,所以 reshape
也可以。
In [409]: ls = np.linspace(1,100,10)
In [410]: ls.reshape(-1,2)
Out[410]:
array([[ 1., 12.],
[ 23., 34.],
[ 45., 56.],
[ 67., 78.],
[ 89., 100.]])
reshape
在方法或函数中形成 returns 一个值,ls
不变。 -1
是一个方便的简写,避免了 //
除法。
这是重塑的就地版本:
In [415]: ls.shape=(-1,2)
reshape
需要相同的元素总数。 resize
允许您更改元素的数量,必要时截断或重复值。我们使用 reshape
的频率比 resize
高得多。 repeat
和 tile
也比 resize
更常见。
.resize
方法就地工作,returns None
。如果有其他名称引用同一个数组,它也根本不会工作。您可以使用函数形式,它创建一个新数组并且没有那么反复无常:
def shapeshift(mylist, num_col):
num_col = int(num_col)
return np.resize(mylist, (mylist.size//num_col,num_col))
我正在尝试将列表转换为具有指定列数的 numpy 数组。我可以让代码在函数外工作,如下所示:
import numpy as np
ls = np.linspace(1,100,100) # Data Sample
ls = np.array(ls) # list --> array
# resize | outside function
ls.resize(ls.shape[0]//2,2)
print(ls)
>> [[ 1. 2.]
[ 3. 4.]
.
.
.
[ 97. 98.]
[ 99. 100.]]
我不明白在尝试将例程放入函数中时出现的错误。我的尝试如下:
# resize | inside function
def shapeshift(mylist, num_col):
num_col = int(num_col)
return mylist.resize(mylist.shape[0]//num_col,num_col)
ls = shapeshift(ls,2)
print(ls)
>> None
我想以这种方式定义原始函数,因为我想要另一个函数,由相同的输入和第三个输入组成,用于在提取值时遍历行,为每个遍历行调用这个原始函数。
In [402]: ls = np.linspace(1,100,10)
In [403]: ls
Out[403]: array([ 1., 12., 23., 34., 45., 56., 67., 78., 89., 100.])
In [404]: ls.shape
Out[404]: (10,)
无需在array
中再次换行;已经是一个了:
In [405]: np.array(ls)
Out[405]: array([ 1., 12., 23., 34., 45., 56., 67., 78., 89., 100.])
resize
就地操作。它returns什么都没有(或None)
In [406]: ls.resize(ls.shape[0]//2,2)
In [407]: ls
Out[407]:
array([[ 1., 12.],
[ 23., 34.],
[ 45., 56.],
[ 67., 78.],
[ 89., 100.]])
In [408]: ls.shape
Out[408]: (5, 2)
有了这个 resize
你就不会改变元素的数量,所以 reshape
也可以。
In [409]: ls = np.linspace(1,100,10)
In [410]: ls.reshape(-1,2)
Out[410]:
array([[ 1., 12.],
[ 23., 34.],
[ 45., 56.],
[ 67., 78.],
[ 89., 100.]])
reshape
在方法或函数中形成 returns 一个值,ls
不变。 -1
是一个方便的简写,避免了 //
除法。
这是重塑的就地版本:
In [415]: ls.shape=(-1,2)
reshape
需要相同的元素总数。 resize
允许您更改元素的数量,必要时截断或重复值。我们使用 reshape
的频率比 resize
高得多。 repeat
和 tile
也比 resize
更常见。
.resize
方法就地工作,returns None
。如果有其他名称引用同一个数组,它也根本不会工作。您可以使用函数形式,它创建一个新数组并且没有那么反复无常:
def shapeshift(mylist, num_col):
num_col = int(num_col)
return np.resize(mylist, (mylist.size//num_col,num_col))