为3D numpy数组中的每个元素传递多个条件的更有效方法

时间:2017-09-19 14:37:08

标签: python arrays numpy

我有一个3维numpy数组,我正在检查多个条件。我正在检查每个元素,看它们是否小于某个数字。如果每个3d元素都被i索引,其中i=[0,1,2]在我所谓的array3中,并且如果其中一个元素大于我设置的数字,则可能给出一个布尔数组[False, True, True][False, False, True],此指数将从array3中删除。

我对每个小于20的元素都有一个愚蠢的方法:

import numpy as np

wx = np.where( np.abs(array3[:,0]) <= 20.0 ) # x values less than 20
xarray3x = array3[:,0][wx]
yarray3x = array3[:,1][wx]
zarray3x = array3[:,2][wx]

wy = np.where( np.abs(yarray3x) <= 20.0 ) # y values less than 20
xarray3xy = xarray3x[wy]
yarray3xy = yarray3x[wy]
zarray3xy = zarray3x[wy]

wz = np.where( np.abs(zarray3xy) <= 20.0 ) # z values less than 20
xarray3xyz = xarray3xy[wz]
yarray3xyz = yarray3xy[wz]
zarray3xyz = zarray3xy[wz]

哪个有效,但跟上我命名的变量可能很烦人。所以现在我正在尝试写一些占用较少行数的东西(希望减少编译时间)。

我正在考虑为每个索引构建一个for循环,如下所示:

for i in range(3):
    w = np.where( abs(array3[:,i]).all() <= 20.  )
n_array = array3[w]

但我只会构造一个值而不是很多值。

1 个答案:

答案 0 :(得分:1)

我认为在这个例子中使用4D阵列是最简单的。在这种情况下,您可以检查向量中值最小的元素是否低于阈值。然后,使用import numpy as np n = 4 # Size of the first three dimensions. array3 = 100.*np.random.rand(n, n, n, 3) # Random numbers between 0 and 100. thres = 20. m = np.empty(array3.shape, dtype=bool) m[:,:,:,:] = (np.min(array3, axis=-1) < thres)[:,:,:,np.newaxis] array3_masked = np.ma.masked_array(array3, mask=m) ,您可以将蒙版应用于整个矢量并创建一个蒙版数组。

XmlAttribute