使用特定值调整数组大小

3
我有一个数组阶段。
 [ (3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0)
 (3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0)
 (3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0)]

我想使用resize方法来调整大小。

phase.resize(MAXLINE)

我得到了这个结果。
[ (3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0)
 (3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0)
 (3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0)
 (0.0, 0.0, 0.0, 0.0, 0.0) (0.0, 0.0, 0.0, 0.0, 0.0)
 (0.0, 0.0, 0.0, 0.0, 0.0)]

我想知道是否可以设置特定的值(NaN或-99999)来替代默认值0.0。

4
Python的数组和列表都没有resize方法。你可能在使用Numpy或类似的库吗?如果是这样,请编辑您的问题并包括相关信息。 - Emil Vikström
正如Emil所说,如果你正在使用一个库,请解释一下,并在标签中添加它,这样它就会出现在搜索结果中。 - SuperBiasedMan
列表有一个“extend”方法,可能适合您的需求。 - shashwat
@Emil Vikström,是的,我正在使用numpy。 - SOCKet
3个回答

2
假设您希望数组具有形状(MAXLINE,5),并且您的数组是一个二维数组,而不是元组列表(正如您问题中的格式所示),则可以使用以下方法:
import numpy as np
MAXLINE = 4
a=np.array([ [3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0],
 [3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0],
 [3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0]])
np.append(a,np.ones((MAXLINE-a.shape[0],a.shape[1]))*np.NAN,axis=0)

生成:

array([[ 3.05354009,  0.3713459 ,  0.31295379, -0.01252314,  0.        ],
       [ 3.05668483,  0.37397185,  0.31368239, -0.02645439,  0.        ],
       [ 3.05982956,  0.3768613 ,  0.31453559, -0.0411693 ,  0.        ],
       [        nan,         nan,         nan,         nan,         nan]])

解释:

np.ones()需要一个形状参数,所以我添加了足够的行使最终形状为(MAXLINE,5),其中5是a的列数(即:a.shape[1])。

np.append()中,axis=0参数告诉numpy要添加行。如果没有这个参数,它会将数组展平。

当然,你可以用任何你喜欢的值来代替np.NAN


1
如果您不依赖于np.resize(),您可以使用以下方法:
import numpy as np


old_array =  [ (3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0),
(3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0),
(3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0)]

maxline = 20


# If you want fullfil extra dimension with NaN 
arr = [(np.NAN,)*len(old_array[0])]*(maxline - len(old_array))

# If you want fullfil extra dimension with anything else
# arr = np.array([(ANYTHING_YOU_WANT,)*len(old_array[0])]*(maxline - old_array.size))

new_ = old_array + arr

print numpy.array(new_)

>> 

[(3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0), (3
.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0), (3.059
8295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0), (nan, nan,
 nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan
, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, na
n, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, n
an, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan,
nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan), (nan,
 nan, nan, nan, nan), (nan, nan, nan, nan, nan)]

我尝试了你的代码,但是出现了以下错误: p=np.concatenate(phase,arr) TypeError: 只有长度为1的数组可以转换为Python标量 - SOCKet

1
由于Python数组不支持调整大小,您可以使用numpy或编写自己的函数来实现,类似下面的示例:
def resize(array, new_size, new_value=0):
    """Resize to biggest or lesser size."""
    element_size = len(array[0]) #Quantity of new elements equals to quantity of first element
    if new_size > len(array):
        new_size = new_size - 1
        while len(array)<=new_size:
            n = tuple(new_value for i in range(element_size))
            array.append(n)
    else:
        array = array[:new_size]
    return array
#Test it
a =  [ (3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0),
(3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0),
(3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0)]
a = resize(a, 5)
print a
a = resize(a, 2)
print a
a = resize(a, 3, 28)
print a 

#Output:
#New size 5, default value 0
#[(3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0), (3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0), (3.0598295600822953, 0.376861295611, 0.314535588286, -0.041169303628, 0.0), (0, 0, 0, 0, 0), (0, 0, 0, 0, 0)]
#new size 2
#[(3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0), (3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0)]
#New size 4, default value 28
#[(3.0535400914168154, 0.371345899229, 0.312953794281, -0.0125231427371, 0.0), (3.056684825749555, 0.373971853521, 0.313682391117, -0.0264543909236, 0.0), (28, 28, 28, 28, 28)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接