Python 如何迭代3D numpy数组
如果我要问的问题听起来很愚蠢,请原谅,我刚刚开始使用Python:D中的numpy和多维数组 也就是说,我有一个[85 x 235 x 327]的3D数组。每个位置都有一个离散值,在大多数情况下,还有NaN 我要做的第一件事是迭代这个数组并删除NaN值,构建一个只包含有效值的新数组 我试过这个: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
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