沿3D阵列中的轴计算大于二维阵列

时间:2017-05-24 03:13:23

标签: arrays python-3.x numpy multidimensional-array numpy-broadcasting

我有一个3D维数组(200,200,3)。这些是使用numpy.dstack堆叠的尺寸(200,200)的图像。我想计算沿轴= 2的值的数量,它们大于相应的2D阈值维度数组(200,200)。输出计数数组应具有维度(200,200)。到目前为止,这是我的代码。

import numpy as np

stacked_images=np.random.rand(200,200,3)
threshold=np.random.rand(200,200)
counts=(stacked_images<threshold).sum(axis=2)

我收到以下错误。

ValueError: operands could not be broadcast together with shapes (200,200,3) (200,200)

如果threshold是整数/浮点值,则代码有效。例如。

threshold=0.3
counts=(stacked_images<threshold).sum(axis=2)

如果阈值是2D数组,是否有一种简单的方法可以做到这一点?我想我不能正确理解numpy广播规则。

1 个答案:

答案 0 :(得分:1)

numpy期望通过值操作创建值。在您的情况下,您似乎想知道完整Z(轴= 2)轨迹中的任何值是否超过阈值中的等效x,y值。

因此,只需确保阈值具有相同的形状,即使用您喜欢的任何方法构建3D阈值。既然你提到了numpy.dstack

import numpy as np

stacked_images = np.random.rand(10, 10, 3)
t = np.random.rand(10, 10)
threshold = np.dstack([t, t, t])
counts = (stacked_images < threshold).sum(axis=2)
print(counts)

,结果是:

[[2 0 3 3 1 3 1 0 1 2]
 [0 1 2 0 0 1 0 0 1 3]
 [2 1 3 0 3 2 1 3 1 3]
 [2 0 0 3 3 2 0 2 0 1]
 [1 3 0 0 0 3 0 2 1 2]
 [1 1 3 2 3 0 0 3 0 3]
 [3 1 0 1 2 0 3 0 0 0]
 [3 1 2 1 3 0 3 2 0 2]
 [3 1 1 2 0 0 1 0 1 0]
 [0 2 2 0 3 0 0 2 3 1]]