如何迭代一个3D numpy阵列



如果我要问的东西听起来很愚蠢,请原谅我,我刚从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)

最新更新