在np.数组

2024-05-13 21:11:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个实验中选择了一些值,我想去掉一些相对于其他行的值。意思:我测量一个场,一个极化和一个极化误差。现在,进行测量的机器有时不会在其中的一些行中写入值。所以我可能会得到: 字段=数据[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]值,因为字段[6]=nan。在

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

^{pr2}$

\u conv函数只是进行一些单位转换,或者在值为“”时写入“nan”。我试着做一些类似的事情:

^{3}$

但是当我得到一个数组,事情变得一团糟。我的下一个方法是计数元素,从所有数组中删除相同的元素。。。等等。很有用,但很难看。那么这里最好的解决方案是什么?在


Tags: 数据方法函数机器元素fielderror数组
3条回答

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

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)

我结合了另一个线索和红虎队的答案,我想与大家分享: 只需在数组上运行此函数,其中包含数据:

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.伊斯南(#element)请使用NaN项标识我的行并删除它们。在

尝试使用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,然后在所有其他数组上应用该掩码。希望有帮助。在

相关问题 更多 >