在numpy数组中设置空值

时间:2014-12-17 14:34:52

标签: python arrays numpy

如何基于条件使numpy数组中的某些值为空? 我不明白为什么我最终得到0而不是null或空值不满足条件... b是一个用0和1值填充的numpy数组,c是另一个完全填充的numpy数组。所有阵列都是71x71x166

a = np.empty(((71,71,166)))
d = np.empty(((71,71,166)))
for indexes, value in np.ndenumerate(b):
    i,j,k = indexes
    a[i,j,k] = np.where(b[i,j,k] == 1, c[i,j,k], d[i,j,k])

我想最终得到一个数组,该数组只有满足条件的值,并且在其他任何地方都是空的,但不改变其形状

要求澄清澄清的全部问题:
我从一个浮动填充阵列开始,形状(71,71,166)
我根据应用于浮点数组的截止值创建一个int数组,基本上创建了多个bin,大致标记出数组中的10个区域,其间为0值 我想要最终得到的是一个具有形状(71,71,166)的数组,其具有特定阵列方向上的平均值(假设垂直方向,如果您将3D数组视为3D立方体)某个“bin” ...
所以我试图循环“bins”b == 1,b == 2等,在满足条件的情况下对float进行采样但在其他地方为null,这样我就可以取平均值,然后在最后重新组合成一个数组循环.... 不确定我是否让自己明白了。我正在使用np.where并使用索引,因为当我尝试执行此操作时仍然会出现错误,尽管它感觉非常低效。

2 个答案:

答案 0 :(得分:4)

考虑这个例子:

import numpy as np
data = np.random.random((4,3))
mask = np.random.random_integers(0,1,(4,3))
data[mask==0] = np.NaN

nan为0时,数据将设置为mask。当然,您可以使用任何类型的条件,或者对b中的不同值执行不同的操作。

要删除除特定bin之外的所有内容,请尝试以下操作:

c[b!=1] = np.NaN

所以,要复制特定bin中的所有内容:

a = np.copy(c)
a[b!=1] == np.NaN

获取bin中所有内容的平均值:

np.mean(c[b==1])

所以也许这可能会做你想要的(其中bin是bin值的列表):

a = np.empty(c.shape)
a[b==0] = np.NaN
for bin in bins:
    a[b==bin] = np.mean(c[b==bin])

答案 1 :(得分:2)

np.empty有时用0填充数组;它未定义empty()数组的内容是什么,所以0完全有效。例如,请尝试这样做:

d = np.nan * np.empty((71, 71, 166)).

但考虑使用numpy的优势,不要在数组上进行迭代:

a = np.where(b, c, d)

(由于b为0或1,我已排除显式比较b == 1。)

您甚至可以考虑使用masked array代替:

a = np.ma.masked_where(b, c)

对于你的问题似乎更有意义:"如何根据条件使numpy数组中的某些值为空?" (用掩码替换null,你就完成了)。