Python Numpy矢量化多维函数(或,为神经网络构建特征平面)

Python Numpy矢量化多维函数(或,为神经网络构建特征平面),python,numpy,multidimensional-array,computer-vision,Python,Numpy,Multidimensional Array,Computer Vision,假设我们在[N][100][100][3]中存储了大小为100x100的N幅彩色(RGB)图像。 因此: 使用numpy构建其他频道最有效的方法是什么?例如,让我们定义: Channel 3 = R + G * 0.5 Channel 4 = If B > 128 Then 1 Else 0 Channel 5 = If R == 100 Then 1 Else 0 Channel 6 = If (R + G) > B Then 1 Else 0 换言之,我们希望得到一个[N][1

假设我们在[N][100][100][3]中存储了大小为100x100的N幅彩色(RGB)图像。 因此:

使用numpy构建其他频道最有效的方法是什么?例如,让我们定义:

Channel 3 = R + G * 0.5
Channel 4 = If B > 128 Then 1 Else 0
Channel 5 = If R == 100 Then 1 Else 0
Channel 6 = If (R + G) > B Then 1 Else 0
换言之,我们希望得到一个[N][100][100][7],每个像素使用上述规则构建额外的4个通道


在numpy中似乎没有通用的方法来矢量化这些操作,但我认为这里应该有一种方法来处理简单的情况。此外,当N较大(>10000)时,什么是最快的方法?

有相对简单的方法,例如:

rgb = np.random.random((1,2,2,3))
r,g,b = np.transpose(rgb, (3,0,1,2))
np.r_["-1, 4, 0", rgb, r+g*0.5, b>128, r==100, (r+g)>b]
# array([[[[ 0.64715017,  0.45204962,  0.28497451,  0.87317498,  0.        ,  0.        ,  1.        ],
#         [ 0.51238478,  0.62095329,  0.9339249 ,  0.82286142,  0.        ,  0.        ,  1.        ]],

#        [[ 0.29647208,  0.81635033,  0.76079918,  0.70464724,  0.        ,  0.        ,  1.        ],
#         [ 0.3307639 ,  0.1878836 ,  0.04642399,  0.4247057 ,  0.        ,  0.        ,  1.        ]]]])
r
串联运算符有点神秘,如果将一个3-int字符串作为第一个参数传递,则表示串联轴、提升操作数的深度、对齐未添加维度的轴

通过按顺序预分配和计算中间产物,可能可以节省一点峰值内存

就速度而言,我没有看到任何明显的改进

rgb = np.random.random((1,2,2,3))
r,g,b = np.transpose(rgb, (3,0,1,2))
np.r_["-1, 4, 0", rgb, r+g*0.5, b>128, r==100, (r+g)>b]
# array([[[[ 0.64715017,  0.45204962,  0.28497451,  0.87317498,  0.        ,  0.        ,  1.        ],
#         [ 0.51238478,  0.62095329,  0.9339249 ,  0.82286142,  0.        ,  0.        ,  1.        ]],

#        [[ 0.29647208,  0.81635033,  0.76079918,  0.70464724,  0.        ,  0.        ,  1.        ],
#         [ 0.3307639 ,  0.1878836 ,  0.04642399,  0.4247057 ,  0.        ,  0.        ,  1.        ]]]])