Python np.如果元素不足,则使用填充来重塑()

Python np.如果元素不足,则使用填充来重塑(),python,pandas,numpy,Python,Pandas,Numpy,是否可以重塑np.array()的形状,并在新形状不一致的情况下,用NaN填充空白 例: 目标,例如2x4矩阵: [1 2 3 4] [5 6 NaN NaN] 我需要这样做来绕过错误:ValueError:无法将大小为6的数组重塑为形状(2,4) 谢谢,我们将首先使用np.pad,然后重塑: m, n = 2, 4 np.pad(arr.astype(float), (0, m*n - arr.size), mode='constant', constant_value

是否可以重塑np.array()的形状,并在新形状不一致的情况下,用NaN填充空白

例:

目标,例如2x4矩阵:

[1 2  3   4]
[5 6 NaN NaN]
我需要这样做来绕过错误:
ValueError:无法将大小为6的数组重塑为形状(2,4)


谢谢,

我们将首先使用
np.pad
,然后重塑:

m, n = 2, 4
np.pad(arr.astype(float), (0, m*n - arr.size), 
       mode='constant', constant_values=np.nan).reshape(m,n)


array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])

这里的假设是
arr
是1D数组。在此代码之前添加一个断言,以在意外情况下失败。

一个可能的解决方案:

将数组转换为浮点(
nan
是浮点类型)

将数据调整为新形状

arr = np.resize(arr, (2,4))

print(arr)

array([[1., 2., 3., 4.],
   [5., 6., 1., 2.]])
用np.NaN替换最后两个条目

arr[-1,-2:] = np.NaN

print(arr)

array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])

执行此操作的方法很多,但(几乎)都相当于创建所需形状和填充值的新数组:

In [50]: arr = np.array([1,2,3,4,5,6])                                          
In [51]: res = np.full((2,4), np.nan)                                           
In [52]: res                                                                    
Out[52]: 
array([[nan, nan, nan, nan],
       [nan, nan, nan, nan]])
In [53]: res.flat[:len(arr)]=arr                                                
In [54]: res                                                                    
Out[54]: 
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])
为了便于复制,我使用了
flat
res
视为1d数组

一个例外是
resize
方法,但它用0填充。并且不更改
dtype
以允许浮动
nan

In [55]: arr.resize(2,4)                                                        
In [56]: arr                                                                    
Out[56]: 
array([[1, 2, 3, 4],
       [5, 6, 0, 0]])
In [50]: arr = np.array([1,2,3,4,5,6])                                          
In [51]: res = np.full((2,4), np.nan)                                           
In [52]: res                                                                    
Out[52]: 
array([[nan, nan, nan, nan],
       [nan, nan, nan, nan]])
In [53]: res.flat[:len(arr)]=arr                                                
In [54]: res                                                                    
Out[54]: 
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])
In [55]: arr.resize(2,4)                                                        
In [56]: arr                                                                    
Out[56]: 
array([[1, 2, 3, 4],
       [5, 6, 0, 0]])