快女阿德南

2024-09-30 22:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想添加数以千计的4D数组元素和计算南斯。 使用1D阵列的一个简单示例是:

X = array([4,7,89,nan,89,65, nan])
Y = array([0,5,4, 9,  8, 100,nan])
z = X+Y
print z = array([4,12,93,9,97,165,nan])

我已经写了一个简单的for循环来解决这个问题,但它需要永远——不是一个聪明的解决方案。 另一个解决方案是创建一个更大的阵列并使用瓶颈nansum,但这会占用我的笔记本电脑太多内存。我需要一笔超过11000箱的流水账。在

有没有人有一个聪明而快速的方法来做到这一点?在


Tags: 方法内存元素示例for数组nan解决方案
3条回答
import numpy as np
z=np.nansum([X,Y],axis=0)

有一种可能性:

>>> x = np.array([1, 2, np.nan, 3, np.nan, 4])
... y = np.array([1, np.nan, 2, 5, np.nan, 8])
>>> x = np.ma.masked_array(np.nan_to_num(x), mask=np.isnan(x) & np.isnan(y))
>>> y = np.ma.masked_array(np.nan_to_num(y), mask=x.mask)
>>> (x+y).filled(np.nan)
array([  2.,   2.,   2.,   8.,  nan,  12.])

真正的困难是您似乎希望nan被解释为零,除非某个特定位置的所有值都是nan。这意味着您必须同时查看x和y来确定要替换哪些nan。如果您可以替换所有的nan值,那么您可以简单地执行np.nan_to_num(x) + np.nan_to_num(y)。在

你可以这样做:

arr1 = np.array([1.0, 1.0, np.nan, 1.0, 1.0, np.nan])
arr2 = np.array([1.0, 1.0, 1.0, 1.0, 1.0, np.nan])
flags = np.isnan(arr1) & np.isnan(arr2)
copy1 = arr1.copy()
copy2 = arr2.copy()
copy1[np.isnan(copy1)] = 0.0
copy2[np.isnan(copy2)] = 0.0
out = copy1 + copy2
out[flags] = np.NaN
print out
array([  2.,   2.,   1.,   2.,   2.,  NaN])

在数组中查找索引中都有NaN的位置。然后,执行@mgilson建议的基本操作,如make copies和将NaN替换为0.0,将两个数组相加,然后将上面标记的索引替换为np.NaN。在

相关问题 更多 >