为什么这个数组重塑例程在函数之外但不在函数内部工作?

时间:2017-03-30 02:53:21

标签: arrays python-3.x numpy reshape numpy-broadcasting

我正在尝试将列表转换为具有指定列数的numpy数组。我可以让代码在函数外部工作,如下所示:

/location1[Variable='variable1'][item1[contains(.,'AB')] or item1[contains(.,'ab')]

尝试在函数中抛出例程时,我不明白我的错误。我的尝试如下:

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.]]

我想以这种方式定义原始函数,因为我想要另一个函数,包括相同的输入和第三个输入,在提取值时循环遍历行,为行上的每个循环调用这个原始函数。

2 个答案:

答案 0 :(得分:2)

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就地运作。它什么都不返回(或无)

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返回一个值,保持ls不变。 -1是一个方便的短手,避免了//分裂。

这是reshape的原位版本:

In [415]: ls.shape=(-1,2)

reshape需要相同的元素总数。 resize允许您根据需要更改元素数量,截断或重复值。我们更频繁地使用reshape resizerepeattile也比resize更常见。

答案 1 :(得分:2)

.resize方法就地工作并返回None。如果有其他名称引用同一个数组,它也会拒绝工作。您可以使用函数表单,它创建一个新数组,而不是反复无常:

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