Python 屏蔽4D布尔numpy阵列的最快方法

Python 屏蔽4D布尔numpy阵列的最快方法,python,performance,numpy,boolean,mask,Python,Performance,Numpy,Boolean,Mask,使用2D布尔掩码屏蔽4D布尔数组的最有效方法 我尝试了两种方法: A.将遮罩重塑为4D,然后遮罩 B.将反转掩模重塑为4D,并生成两个矩阵 import numpy as np import time I = 150 J = 2000 K = I S = 25 matrix_to_mask = np.random.choice(a=[True, False], size=(I, J, K, S)) mask_2d = np.random.choice(a=[True, False], siz

使用2D布尔掩码屏蔽4D布尔数组的最有效方法

我尝试了两种方法:

A.将遮罩重塑为4D,然后遮罩

B.将反转掩模重塑为4D,并生成两个矩阵

import numpy as np
import time

I = 150
J = 2000
K = I
S = 25

matrix_to_mask = np.random.choice(a=[True, False], size=(I, J, K, S))
mask_2d = np.random.choice(a=[True, False], size=(I, S))

t = time.time()
matrix_to_mask[np.tile(mask_2d[:, np.newaxis, np.newaxis, :], (1, J, K, 1))] = False
print("Mask: " + str(time.time() - t)) # 2.77 sec

t = time.time()
a = matrix_to_mask * np.tile(np.invert(mask_2d)[:, np.newaxis, np.newaxis, :], (1, J, K, 1))
print("Product: " + str(time.time() - t)) # 1 sec
有没有其他方法可以加快掩模速度

谢谢

我会用这个。广播将生成低维阵列的“虚拟”副本。例如,数组沿指定的维度重复,但未分配新内存,它将仅指向原始值。因此,这是更有效的,因为它使用更少的内存,它更快,因为它不花时间分配

t = time.time()
mask_4d = np.broadcast_to(mask_2d, matrix_to_mask.shape)

a = matrix_to_mask * mask_4d
# matrix_to_mask[mask_4d] = False
print("Broadcast: " + str(time.time() - t))
因此:

掩码:2.08033663911133

产品:0.8886129856109619

广播:0.4950692653656006


也就是说,我检查了获得的掩码的值和您使用
np.tile(mask_2d[:,np.newaxis,np.newaxis,:],(1,J,K,1))生成的掩码的值。
它们不对应,所以有些东西关闭了。也许可以检查一下你的方法是否真的产生了你想要的掩码,因为通常情况下,
np.broadcast\u to
正是你想要的,所以我认为这是正确的…

看起来很有希望。但是,仅适用于尺寸k=I的特殊情况。例如,如果我将k(轴=2)尺寸更改为10,则np.broarcast_to不起作用。基本上,2d遮罩是第一个和最后一个轴,而不是4D的最后两个轴。np.broadcast\u to似乎不允许在掩码2d之间添加轴。要解决我的上述评论,必须在应用
np.broadcast\u to
之前进行重塑。mask_4d现在是:
np.broadcast_to(mask_2d[:,np.newaxis,np.newaxis,:],matrix_to_mask.shape)
。在我的机器里加起来是0.7秒。仍然是一个很好的加速。谢谢
import numpy as np
import time

I = 150
J = 1000
K = I
S = 25

matrix_to_mask = np.random.choice(a=[True, False], size=(I, J, K, S))
mask_2d = np.random.choice(a=[True, False], size=(I, S))

t = time.time()
matrix_to_mask[np.tile(mask_2d[:, np.newaxis, np.newaxis, :], (1, J, K, 1))] = False
print("Mask: " + str(time.time() - t)) # 2.77 sec

t = time.time()
a = matrix_to_mask * np.tile(mask_2d[:, np.newaxis, np.newaxis, :], (1, J, K, 1))
print("Product: " + str(time.time() - t)) # 1 sec

t = time.time()
mask_4d = np.broadcast_to(mask_2d, matrix_to_mask.shape)

a = matrix_to_mask * mask_4d
# matrix_to_mask[mask_4d] = False
print("Broadcast: " + str(time.time() - t))