Python Numpy矢量化多维函数(或,为神经网络构建特征平面)
假设我们在[N][100][100][3]中存储了大小为100x100的N幅彩色(RGB)图像。 因此: 使用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
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. ]]]])