我有一个n x m x 3 numpy数组。这代表了向复杂功能绘图仪的RGB表示的中间一步.当绘制的函数具有无穷大的值或具有奇异性时,RGB数据的一部分就变成了NaNs。
我正在寻找一种有效的方法,将包含NaN的行替换为我选择的行,比如[0, 0, 0]或[1, 1, 1]。在RGB值方面,这会将行为不佳的像素替换为白色或黑色像素。我所说的高效,是指利用numpy的矢量化和速度的某种方式。
请注意,我并不只是希望将NaN值替换为0(我知道如何使用numpy.where);如果一行包含NaN,则需要替换整行。我怀疑在numpy中可以很好地做到这一点,但我不确定如何做到。
具体问题
假设给我们一个2 x 2 x 3数组arr。如果一行包含5,我希望用[0, 0, 0]替换该行。缓慢执行此操作的代码如下所示。
import numpy as np
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 3, 5], [2, 4, 6]]])
# so arr is
# array([[[1, 2, 3],
# [4, 5, 6]],
#
# [[1, 3, 5],
# [2, 4, 6]]])
# Trivial and slow version to replace rows containing 5 with [0,0,0]
for i in range(len(arr)):
for j in range(len(arr[i])):
if 5 in arr[i][j]:
arr[i][j] = np.array([0, 0, 0])
# Now arr is
#
# array([[[1, 2, 3],
# [0, 0, 0]],
#
# [[0, 0, 0],
# [2, 4, 6]]])我们如何利用numpy的优势来实现这一点呢?
发布于 2019-11-21 15:29:56
更简单的方法是-
arr[np.isin(arr,5).any(-1)] = 0如果它只是你想要的一个值,那么我们可以简化为-
arr[(arr==5).any(-1)] = 0如果您希望与NaN相匹配,则需要进行不同的比较,并使用np.isnan -
arr[np.isnan(arr).any(-1)] = 0如果您希望分配数组值,而不仅仅是0,则解决方案将保持不变。因此-
arr[(arr==5).any(-1)] = new_array发布于 2019-11-21 15:30:37
arr[np.broadcast_to((arr == 5).any(-1)[..., None], arr.shape)] = 0
array([[[1, 2, 3],
[0, 0, 0]],
[[0, 0, 0],
[2, 4, 6]]])正如FYI一样,根据您的描述,如果您想要找到np.nans而不是像5这样的整数,则不应该使用==,而应该使用np.isnan
arr[np.broadcast_to((np.isnan(arr)).any(-1)[..., None], arr.shape)] = 0发布于 2019-11-21 15:31:00
您可以使用in1d函数来完成它,如下所示
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 3, 5], [2, 4, 6]]])
arr[np.in1d(arr,5).reshape(arr.shape).any(axis=2)] = [0,0,0]
arrhttps://stackoverflow.com/questions/58978312
复制相似问题