在NumPy数组中设置空值

2024-03-28 18:20:27 发布

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

如何根据条件使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,71166)
我根据应用于float数组的截止值创建了一个int数组,基本上创建了许多bin,大致在数组中标记出10个区域,0的值介于
我想要得到的是一个形状为(71,71166)的数组,它的平均值在特定的数组方向(假设垂直方向,如果你认为一个3D数组是3D立方体)的某个“bin”…
所以我试图遍历“bins”b==1,b==2等,在满足条件的地方对浮点进行采样,但在其他地方为空,这样我就可以取平均值,然后在循环结束时重新组合成一个数组….
不知道我是不是在表达自己的意思。我使用的是np.where和索引,当我尝试在没有效率的情况下进行索引时,会不断地出现错误。


Tags: numpybin地方np数组方向where条件
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替换为mask就完成了)。

举个例子:

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

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

要清除除特定存储箱之外的所有内容,请尝试以下操作:

c[b!=1] = np.NaN

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

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

要获得垃圾箱中所有东西的平均值:

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

因此,这也许可以满足您的需要(其中bins是bin值的列表):

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

相关问题 更多 >