numpy设置包含NaN的索引数组的多维数组

时间:2018-04-03 20:57:10

标签: python numpy matrix

我有一个问题让我疯狂了大约一个星期。我开始使用一个大型的形状(2700,1000,3)称为A,然后有2个形状的阵列(800,600),称为B和C. A和B填充了感兴趣的索引。更大的数组

A[B[i][j]][C[i][j]].shape 

是由B [i] [j]和C [i] [j]给出的索引处的3个值的1d阵列,例如[0,0,0]。现在我想将它设置为另一个名为D的另一个形状数组(800,600)。如果我使用以下方法,则可以解决这个问题:

D[:] = A[B, C]

但是,我现在将NaN项引入B和C.这意味着遇到此情况时A [B] [C]会返回错误。我不能简单地做到以下几点:

B = np.where(np.logical_or(B>0, C>0), B, 0)

因为这将使NaN值被0替换,我最终想要的是当代表B或C的索引是NaN时:

D[i][j] = [0, 0, 0]

我最近的尝试是实现这样的事情:

D = np.where(np.logical_or(np.isnan(A), np.isnan(B)), self.pix[A, B], [0,0,0])

然而,NaN指数仍在通过。很抱歉,如果这篇文章解析得不好,我正试着解释一下,我可以。

这是我想要实现的简化版本,但它还没有工作:

import numpy as np

import numpy as np

coords = np.array([[[3, 4, 2], [2, 1, np.nan]], [[2,3,2],[1, 0, 2]]])
x = np.divide(coords[0], 2)
y = np.divide(coords[1], 2)
a = np.array([1, 1, 1])
a1 = a*1
a2 = a*2
a3 = a*3
a4 = a *4

A =  np.array([[a1, a2, a2, a1], [a2, a3, a3, a4],  [a3, a4, a4, a1],  [a3, a4, a1, a1]])
D =  np.array([[a1, a2, a4], [a1, a3, a2]])

print(np.where(np.isnan(x)))
D = (np.where(x>0, A[x.astype(int), y.astype(int)], [0, 0, 0]))

1 个答案:

答案 0 :(得分:1)

您可以为索引数组中的NaN使用单独的布尔蒙版,然后使用np.newaxis/None将组合蒙版扩展为使用新轴的3D,并将其与np.where一起使用 -

B_nanmask = np.isnan(B)
C_nanmask = np.isnan(C)
BC_nanmask = B_nanmask | C_nanmask

# Replace NaNs with zeros to have a *valid* array w/o NaNs
B[B_nanmask] = 0
C[C_nanmask] = 0

out = np.where(BC_nanmask[...,None], 0, A[B.astype(int),C.astype(int)])

或者,分配到索引数组 -

out = A[B.astype(int),C.astype(int)]
out[BC_nanmask] = 0

如果您不想打扰索引数组,我们可以单独设置它们的整数版本 -

B_int = np.where(B_nanmask, 0, B.astype(int))
C_int = np.where(C_nanmask, 0, C.astype(int))
out = np.where(BC_nanmask[...,None], 0, A[B_int, C_int])