为什么这个数组重塑例程在函数外工作而不是在函数内?

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 高得多。 repeattile 也比 resize 更常见。

.resize 方法就地工作,returns None。如果有其他名称引用同一个数组,它也根本不会工作。您可以使用函数形式,它创建一个新数组并且没有那么反复无常:

def shapeshift(mylist, num_col):
    num_col = int(num_col)
    return np.resize(mylist, (mylist.size//num_col,num_col))