我有一个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]
但我只会构造一个值而不是很多值。
答案 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