用numpy过滤Nan

q8l4jmvw  于 2022-12-18  发布在  其他
关注(0)|答案(2)|浏览(147)

我有一个形状为(115,2)的数组,每列有115个数字,第2列中的一些数字是NaN,如何使用numpy过滤这两列,以去除第2列中的NaN和第1列中相应的数字?
示例

array([[10., 10.],
       [20., 13.],
       [ 5., nan],
       [ 6., nan]])

array([[10., 10.],
       [20., 13.]])

我想过滤两列以排除第二列为NaN的值。我想保留形状,以便我可以对数字进行统计,如相关性。有什么想法吗?
如果我尝试~np.isnan,数组会失去形状,而我想保留它。请不要Pandas!

ljo96ir5

ljo96ir51#

比如说,data 是你的numpy数组,那么new-data就是你的去掉NaN的numpy数组

new_data = data[np.logical_not(np.isnan(data))]
wfveoks0

wfveoks02#

arr[~np.isnan(arr[:,1])]

那么
过滤行,但仅从布尔值的一维数组中过滤
我想当你说“我已经试过~np.isnan“时,你的意思是你已经试过arr[~np.isnan(arr)]了。但是,由于arr是2D的(形状为(115,2)),~na.isnan(arr)也是,它是一个(115,2)形布尔数组。在这种情况下,从这样的数组中索引得到的是与True匹配的arr的所有值。(它怎么能保持原来的形状,因为你可能有不同数量的元素在两列)。
另一方面,~na.isnan(arr[:,1])是一个1D(115,)布尔数组,用它索引只选择行。
请参见使用布尔数组进行索引的示例

arr=np.arange(10).reshape(5,-1)
#array([[0, 1],
#       [2, 3],
#       [4, 5],
#       [6, 7],
#       [8, 9]])

# Indexing with a 2D-array of booleans (same shape as arr, so 5x2 here

arr[[[True, False], [False, False], [True, True], [False, False], [False, True]]]
#array([0, 4, 5, 9])
# I select the 1st element of 1st row, both elements of 3rd row, and last element of last row, so 0,4,5,9

# Indexing only along 1st axis, so with a 1d-array of 5 booleans, to select rows
arr[[True, False, True, True, False]]
#array([[0, 1],
#       [4, 5],
#       [6, 7]])
# I selected 1st, 3rd and 4th rows

相关问题