我使用numpy.recarray
- Method从.csv-Inputfile创建了csv2rec()
。 Inputfile,因此recarray有空行,没有数据(分别为nan
- 值)。我想将nan
- 行的这个重新排列切片到多个子数组中,排除最终数组中的nan
- 行,如下所示。
包含2列的原始重组:
[(1,2)
(2,2)
(nan,nan)
(nan,nan)
(4,4)
(4,3)]
没有纳米值的2个子阵列:
[(1,2)
(2,2)]
和
[(4,4)
(4,3)]
我知道这可以使用循环来管理,但也许有一种更简单,更优雅的方式?另外:是否可以保留每列的标题信息,以便我可以通过参数名称引用列,而不仅仅是切片后的col-index?
答案 0 :(得分:1)
对于2D-array
:
a[~np.all(np.isnan(a),axis=1)]
对于结构化数组(重新排列),您可以这样做:
def remove_nan(a, split=True):
cols = [i[0] for i in eval(str(a.dtype))]
col = cols[0]
test = ~np.isnan(a[col])
if not split:
new_len = len(a[col][test])
new = np.empty((new_len,), dtype=a.dtype)
for col in cols:
new[col] = a[col][~np.isnan(a[col])]
return new
else:
indices = [i for i in xrange(len(a)-1) if test[i+1]!=test[i]]
return [i for i in np.split(a, indices) if not np.isnan(i[col][0])]
仅获取nan
不使用split=False
的行。例如:
a = np.array([(1,2),(2,2),(nan,nan),(nan,nan),(4,4),(4,3)], dtype=[('test',float),('col2',float)])
remove_nan(a)
#[array([(1.0, 2.0), (2.0, 2.0)],
# dtype=[('test', '<f8'), ('col2', '<f8')]),
# array([(4.0, 4.0), (4.0, 3.0)],
# dtype=[('test', '<f8'), ('col2', '<f8')])]
答案 1 :(得分:0)
如果你只是想摆脱空白,而不是切片,那么只需用选择标准来压缩你的数组,检查是否为nan。提示,nan&lt;&gt;南。
如果你真的希望在nans处切片然后使用一些这样的循环来生成Non-Nan索引的列表,然后使用choose来生成子数组 - 它们应该保留那些col的名称。 / p>
答案 2 :(得分:0)
您可以使用scipy.ndimage.label获取0和1的数组中的区域:
>>> import numpy as np
>>> from scipy import ndimage
>>> nan = np.nan
>>> a = np.array([(1,2),(2,2),(nan,nan),(nan,nan),(4,4),(4,3)], dtype=[('test',float),('col2',float)])
>>> non_nan = np.logical_not(np.isnan(a['test'])).astype(int)
>>> labeled_array, num_features = ndimage.label(non_nan)
>>> for region in range(1,num_features+1):
... #m = a[np.where(labeled_array==region)]
... m = a[labeled_array==region]
... print(region)
... print(m)
... print(m['col2'])
...
1
[(1.0, 2.0) (2.0, 2.0)]
[ 2. 2.]
2
[(4.0, 4.0) (4.0, 3.0)]
[ 4. 3.]
如果你知道你将永远有两个区域,那么你不需要循环,只需参考:
m1 = a[labeled_array==1]
m2 = a[labeled_array==2]