Python 如何迭代3D numpy数组

Python 如何迭代3D numpy数组,python,arrays,numpy,Python,Arrays,Numpy,如果我要问的问题听起来很愚蠢,请原谅,我刚刚开始使用Python:D中的numpy和多维数组 也就是说,我有一个[85 x 235 x 327]的3D数组。每个位置都有一个离散值,在大多数情况下,还有NaN 我要做的第一件事是迭代这个数组并删除NaN值,构建一个只包含有效值的新数组 我试过这个: for index,value in np.ndenumerate( data ): print "index value: " + str(index) print "valu

如果我要问的问题听起来很愚蠢,请原谅,我刚刚开始使用Python:D中的numpy和多维数组

也就是说,我有一个[85 x 235 x 327]的3D数组。每个位置都有一个离散值,在大多数情况下,还有NaN

我要做的第一件事是迭代这个数组并删除NaN值,构建一个只包含有效值的新数组

我试过这个:

    for index,value in np.ndenumerate( data ):
    print "index value: " + str(index)
    print "value: " + str(value)
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
但这只会执行一次传递…不确定ndenumerate的功能

我也试过:

    for index,value in np.ndenumerate( data ):
    print "index value: " + str(index)
    print "value: " + str(value)
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个点…这将永远需要…因此,是否有任何内置函数可以从现有数组中删除值而不必迭代所有元素?

完全满足您的要求:

将nan替换为零,将inf替换为有限数

返回一个数组或标量,将数字(NaN)替换为零, (正)无穷大,有一个很大的数字和负无穷大 用一个很小(或负数)的数字

像这样使用它:

x = np.nan_to_num(x)

这在一定程度上取决于您希望最终数组的外观。这里有一个东西能真正做到你所说的。但是,它不会保留形状。设置阵列:

>>> 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值的平面数组。或者你想用其他东西替换这些值?你读过了吗?我想你会发现它很有用。@senderle我只想去掉这些值,用一个包含所有值的最终数组,保留形状,如果可能的话,否则是一个平面数组。@MrE是的,我做了,谢谢分享:)问题的标题在这里有误导性…谢谢,我给它一个tryOk,感谢您提供的详细答案…对于像我这样大的阵列,这是否可取?从我的角度来看,我不介意丢失形状,因为,如果我没有值…我不介意丢失该列,真的。这确实会生成与原始列大小相同的第二个布尔数组;不过,对于大多数现代计算机来说,两个包含600万个元素的阵列并不太难处理。尽管如此,
numpy
中仍有许多与
nan
相关的函数,如果您需要,这些函数可能有助于减少内存使用。例如,您可以使用创建“屏蔽数组”;屏蔽阵列占用更多内存,但可能会节省内存或在某些操作中效率更高。感谢senderle,这可以有效地工作。你知道numpy是如何将多维数组展平为一维数组的吗?只是想知道在这个过程中我丢失了多少“信息”:D