删除np.array中选定的行

时间:2015-03-03 08:36:29

标签: python arrays numpy nan genfromtxt

我从实验中选择了一些值,我想删除一些与其他行相关的行。含义:我测量场,极化和极化误差。现在,进行此测量的机器有时不会在某些行中写入值。所以我可能会得到:     field = data [0]

field = [1,2,3,3,2,1,nan,4,1,2]
polarization = [nan, 10,230,13,123,50,102,90,45]
error = [0.1, 0.1, 0.2, 0.1, 0.1, 0.3, 0.1, 0.1, 0.4, 0.2]

现在我想删除场,偏振和误差的第一个元素,因为极化[0]值= nan。并且所有数组的[6]值因为field [6] = nan。

这就是我获取数据的方式:

class DataFile(object):
    def __init__(self, filename):
        self._filename = filename


    def read_dat_file(self):
        data = np.genfromtxt(self._filename, delimiter=',', \
        usecols=(3,4,5,), skip_header=23, skip_footer=3, unpack=True, converters={\
        3: lambda x: self._conv(x), \
        4: lambda x: self._conv(x), \
        5: lambda x: self._2_conv(x)})
        return data

a = DataFile("DATFILE.DAT")
print a

_conv函数只是做一些单位转换或写'&nan;'如果价值是" &#34 ;.我试着做类似的事情:

data = data[~np.isnan(data).any(axis=1)]

然后我回到一个阵列,事情变得混乱。我的下一个方法是计算元素,从所有数组中删除相同的元素......等等。工作,但它很难看。那么这里有最好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

尝试使用mask_where命令。

一个(非常基本的)例子:

y = np.array([2,1,5,2])                         # y axis
x = np.array([1,2,3,4])                         # x axis
m = np.ma.masked_where(y>5, y)                  # filter out values larger than 5
new_x = np.ma.masked_where(np.ma.getmask(m), x) # applies the mask of m on x

好处是你现在可以将这个掩码应用于更多数组,而无需对每个数组进行掩码处理。它不会像计算元素一样难看。

在您的情况下,您可能需要遍历每个数组,检查nan然后在所有其他数组上应用该掩码。希望有所帮助。

答案 1 :(得分:0)

您可以迭代行并为行创建掩码,然后使用布尔索引来获取传递的行的视图:

import numpy as np

field = [1,2,3,3,2,1,-1,4,1,2]
polarization = [-1, 10,230,13,123,50,102,90,45,1337]
error = [0.1, 0.1, 0.2, 0.1, 0.1, 0.3, 0.1, 0.1, 0.4, 0.2]

#transposition is needed to get expected row-col format
array = np.array([field, polarization, error]).T
print(array)

#create your filter function
filter = lambda row : row[0] > 0 and row[1] > 0 and row[2] > 0

#create boolean mask by applying filter
mask = np.apply_along_axis(filter, 1, array)
print(mask)

new_array = array[mask]
print(new_array)

答案 2 :(得分:0)

我结合了另一个主题和red_tigers的答案,我想与你分享: 只需在数组中运行此函数,其中包含数据:

data = np.array([field, polarization, error]).T

def delete_NaN_rows(self, data):
    filter = lambda row: ~np.isnan(row[0]) and ~np.isnan(row[1]) and ~np.isnan(row[2])
    mask = np.apply_along_axis(filter, 1, data)
    clean_data = data[mask]
    return clean_data.T

我使用了np.isnan(#element)的反转(〜)来确定带有NaN条目的行并删除它们。