请原谅我,如果我要问的事情听起来很愚蠢,我刚开始使用Python中的numpy和多维数组:D
那就是说,我有一个[85 x 235 x 327]的3D数组。每个位置都有一个离散值,在大多数情况下,它是NaN。
我要做的第一件事是迭代这个数组并删除NaN值,构建一个只包含有效值的新数组。
我试过这个:
for index,value in np.ndenumerate( data ):
print "index value: " + str(index)
print "value: " + str(value)
但是这只会执行一次传递...不确定ndenumerate
是做什么的。
还试过这个:
indexOne = waves.shape[0]
indexTwo = waves.shape[1]
indexThree = waves.shape[2]
for i in range(indexOne):
for j in range(indexTwo):
for k in range(indexThree):
a = waves[i,j,k]
print a.data
虽然这确实在迭代...考虑到我有6531825分......这将永远需要...因此,是否有任何内置函数可以从现有数组中删除值而无需迭代所有元素?
答案 0 :(得分:1)
nan_to_num
完全符合您的要求:
用零和inf替换有限数字的nan。
返回一个数组或标量,用零替换非数字(NaN), (正)无穷大,数量非常大,负无穷大 非常小(或负数)的数字。
使用它像:
x = np.nan_to_num(x)
答案 1 :(得分:1)
这取决于你想要最终数组的样子。这就是你说的话。但是,它不保留形状。设置数组:
>>> a = numpy.linspace(0, 26, 27).reshape(3, 3, 3)
>>> a[1][0] = numpy.nan
>>> a
array([[[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]],
[[ nan, nan, nan],
[ 12., 13., 14.],
[ 15., 16., 17.]],
[[ 18., 19., 20.],
[ 21., 22., 23.],
[ 24., 25., 26.]]])
然后您可以使用isnan
创建一个掩码:
>>> numpy.isnan(a)
array([[[False, False, False],
[False, False, False],
[False, False, False]],
[[ True, True, True],
[False, False, False],
[False, False, False]],
[[False, False, False],
[False, False, False],
[False, False, False]]], dtype=bool)
并使用它来索引a
:
>>> a[~numpy.isnan(a)]
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 12., 13.,
14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,
25., 26.])
您可以使用类似的技巧来执行nan
值的许多其他操作。例如:
>>> a[numpy.isnan(a)] = 0
>>> a
array([[[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]],
[[ 0., 0., 0.],
[ 12., 13., 14.],
[ 15., 16., 17.]],
[[ 18., 19., 20.],
[ 21., 22., 23.],
[ 24., 25., 26.]]])