我正在寻找的功能看起来像这样:
data = np.array([[1, 2, 3, 4],
[2, 3, 1],
[5, 5, 5, 5],
[1, 1]])
result = fix(data)
print result
[[ 1. 2. 3. 4.]
[ 2. 3. 1. 0.]
[ 5. 5. 5. 5.]
[ 1. 1. 0. 0.]]
我正在使用的这些数据阵列非常大,所以我非常感谢最有效的解决方案。
编辑:数据作为python列表列表从磁盘读入。
答案 0 :(得分:17)
这可能是一种方法 -
def numpy_fillna(data):
# Get lengths of each row of data
lens = np.array([len(i) for i in data])
# Mask of valid places in each row
mask = np.arange(lens.max()) < lens[:,None]
# Setup output array and put elements from data into masked positions
out = np.zeros(mask.shape, dtype=data.dtype)
out[mask] = np.concatenate(data)
return out
示例输入,输出 -
In [222]: # Input object dtype array
...: data = np.array([[1, 2, 3, 4],
...: [2, 3, 1],
...: [5, 5, 5, 5, 8 ,9 ,5],
...: [1, 1]])
In [223]: numpy_fillna(data)
Out[223]:
array([[1, 2, 3, 4, 0, 0, 0],
[2, 3, 1, 0, 0, 0, 0],
[5, 5, 5, 5, 8, 9, 5],
[1, 1, 0, 0, 0, 0, 0]], dtype=object)
答案 1 :(得分:13)
您可以使用pandas代替numpy:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[1, 2, 3, 4],
...: [2, 3, 1],
...: [5, 5, 5, 5],
...: [1, 1]], dtype=float)
In [3]: df.fillna(0.0).values
Out[3]:
array([[ 1., 2., 3., 4.],
[ 2., 3., 1., 0.],
[ 5., 5., 5., 5.],
[ 1., 1., 0., 0.]])
答案 2 :(得分:6)
使用np.pad()
。
In [62]: arr
Out[62]:
[array([0]),
array([83, 74]),
array([87, 61, 23]),
array([71, 3, 81, 77]),
array([20, 44, 20, 53, 60]),
array([54, 36, 74, 35, 49, 54]),
array([11, 36, 0, 98, 29, 87, 21]),
array([ 1, 22, 62, 51, 45, 40, 36, 86]),
array([ 7, 22, 83, 58, 43, 59, 45, 81, 92]),
array([68, 78, 70, 67, 77, 64, 58, 88, 13, 56])]
In [63]: max_len = np.max([len(a) for a in arr])
In [64]: np.asarray([np.pad(a, (0, max_len - len(a)), 'constant', constant_values=0) for a in arr])
Out[64]:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[83, 74, 0, 0, 0, 0, 0, 0, 0, 0],
[87, 61, 23, 0, 0, 0, 0, 0, 0, 0],
[71, 3, 81, 77, 0, 0, 0, 0, 0, 0],
[20, 44, 20, 53, 60, 0, 0, 0, 0, 0],
[54, 36, 74, 35, 49, 54, 0, 0, 0, 0],
[11, 36, 0, 98, 29, 87, 21, 0, 0, 0],
[ 1, 22, 62, 51, 45, 40, 36, 86, 0, 0],
[ 7, 22, 83, 58, 43, 59, 45, 81, 92, 0],
[68, 78, 70, 67, 77, 64, 58, 88, 13, 56]])
答案 3 :(得分:4)
如果以某种矢量化的方式,这将是很好的,但我仍然是一个NOOB,所以我现在可以想到它!
import numpy as np,numba as nb
a=np.array([[1, 2, 3, 4],
[2, 3, 1],
[5, 5, 5, 5,5],
[1, 1]])
@nb.jit()
def f(a):
l=len(max(a,key=len))
a0=np.empty(a.shape+(l,))
for n,i in enumerate(a.flat):
a0[n]=np.pad(i,(0,l-len(i)),mode='constant')
a=a0
return a
print(f(a))
答案 4 :(得分:0)
data = np.array([[1, 2, 3, 4],
[2, 3, 1],
[5, 5, 5, 5],
[1, 1]])
max_len=max([len(i) for i in data])
np.array([ np.pad(data[i],
(0,max_len-len(data[i])),
'constant',
constant_values=0) for i in range(len(data))])
计算各个数组的长度,然后将这些长度中的最大值存储在变量中。 之后,矩阵的所有单独行都将在右侧填充0以匹配最大长度。