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

2024-06-16 10:44:16 发布

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

我有一个三维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]

但是我将只构造一个值而不是多个值。你知道吗


Tags: falsetrue元素npabs数组whereless
1条回答
网友
1楼 · 发布于 2024-06-16 10:44:16

我认为在这个例子中使用4D阵列是最简单的。在这种情况下,可以检查向量中具有最低值的元素是否低于阈值。然后,使用np.newaxis,可以将掩码应用于整个向量并创建一个掩码数组。你知道吗

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)

相关问题 更多 >