如果我要问的东西听起来很愚蠢,请原谅我,我刚从python中的numpy和多维数组开始:d
也就是说,我有一个3D阵列[85 x 235 x 327]。每个位置都具有离散值,在大多数情况下,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分...这将永远花费...因此,是否有任何内置功能可以从现有数组中删除值迭代所有元素?
这有点取决于您想要的最终数组的外观。这实际上是您所说的事情。但是,它不能保留形状。设置数组:
>>> 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.]]])
nan_to_num
完全做您想要的:
用有限数字替换为零,然后用inf替换。
返回一个数组或标量替换,而不是零的数字(NAN), (正)无穷大,无穷大
很小(或负数)。
使用它:
x = np.nan_to_num(x)