我正在尝试在特定位置的2D数组中插入任意数量的NaN值行。我正在从.csv文件中的微控制器记录一些数据并使用python进行解析。
数据存储在3列2D数组中,如此
[(122.0, 1.0, -47.0) (123.0, 1.0, -47.0) (125.0, 1.0, -44.0) ...,
(39.0, 1.0, -47.0) (40.0, 1.0, -45.0) (41.0, 1.0, -47.0)]
第一列是序列计数器。我要做的是迭代序列值,差异电流和先前的序列号,并插入尽可能多的纳米行,因为缺少序列。
基本上,
[(122.0, 1.0, -47.0) (123.0, 1.0, -47.0) (125.0, 1.0, -44.0)]
会变成
[(122.0, 1.0, -47.0) (123.0, 1.0, -47.0) (nan, nan, nan) (125.0, 1.0, -44.0)]
但是np.insert
的以下实现会产生错误
while (i < len(list[1])):
pid = list[i][0]
newMissing = (pid - LastGoodId + 255) % 256
TotalMissing = TotalMissing + newMissing
np.insert(list,i,np.zeros(newMissing,1) + np.nan)
i = i + newMissing
list[i][0] = TotalMissing
LastGoodId = pid
---&GT; 28 np.insert(list,i,np.zeros(newMissing,1)+ np.nan) 29 i = i + newMissing 30 list [i] [0] = TotalMissing
TypeError:数据类型不理解
关于如何实现这一目标的任何想法?
答案 0 :(得分:2)
import numpy as np
a = np.arrray([(122.0, 1.0, -47.0), (123.0, 1.0, -47.0), (125.0, 1.0, -44.0)]))
np.insert(a, 2, np.nan, axis=0)
array([[ 122., 1., -47.],
[ 123., 1., -47.],
[ nan, nan, nan],
[ 125., 1., -44.]])
答案 1 :(得分:1)
方法#1
我们可以使用基于初始化的方法来处理任何长度的多个间隙和间隙 -
# Pre-processing step to create monotonically increasing array for first col
id_arr = np.zeros(arr.shape[0])
id_arr[np.flatnonzero(np.diff(arr[:,0])<0)+1] = 256
a0 = id_arr.cumsum() + arr[:,0]
range_arr = np.arange(a0[0],a0[-1]+1)
out = np.full((range_arr.shape[0],arr.shape[1]),np.nan)
out[np.in1d(range_arr,a0)] = arr
示例运行 -
In [233]: arr # Input array
Out[233]:
array([[ 122., 1., -47.],
[ 123., 1., -47.],
[ 126., 1., -44.],
[ 39., 1., -47.],
[ 40., 1., -45.],
[ 41., 1., -47.]])
In [234]: out
Out[234]:
array([[ 122., 1., -47.],
[ 123., 1., -47.],
[ nan, nan, nan],
[ nan, nan, nan],
[ 126., 1., -44.],
[ nan, nan, nan], (168 NaN rows)
.....
[ nan, nan, nan],
[ nan, nan, nan],
[ 39., 1., -47.],
[ 40., 1., -45.],
[ 41., 1., -47.]])
方法#2
可以建议使用np.insert
而不是初始化来处理此类通用案例的替代方法,如此 -
idx = np.flatnonzero(~np.in1d(range_arr,a0))
out = np.insert(arr,idx - np.arange(idx.size),np.nan,axis=0)