如何迭代3D numpy数组

时间:2014-01-23 11:54:36

标签: python arrays numpy

请原谅我,如果我要问的事情听起来很愚蠢,我刚开始使用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分......这将永远需要...因此,是否有任何内置函数可以从现有数组中删除值而无需迭代所有元素?

2 个答案:

答案 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.]]])