为了提高速度,我想避免forloops。我有一个看起来像的图像数组:image = np.zeros_like(np.zeros(shape=(480,640,1)),dtype=np.uint8)
和Events
具有以下类型的类型化np数组,dtype = [('x', '<f8'),('y', '<f8'),('grayVal','<u2')
其中“ x” =行,“ y” =图像数组的列。
问题是:如何将grayVal
in分配Events
给allx
和y
in image
?
到目前为止,我已经尝试过(并且更加无法显示):For循环:
for event in Events:
image[event['y'],event['x']] = event['grayVal']
和索引
events['y'].shape
(98210,)
events['x'].shape
(98210,)
events['grayVal'].shape
(98210,)
image[np.ix_(events['y'],events['x'])] = events['grayVal']
由于错误消息,它以某种方式不起作用:
ValueError: shape mismatch: value array of shape (98210,) could not be broadcast to indexing result of shape (98210,98210,1)
我想念什么?谢谢您的帮助。
让我们来看一个小例子,一个我们可以实际研究和使用的例子!
制作结构化数组:
In [32]: dt = np.dtype([('x', int),('y', int) ,('grayVal','u2')])
In [33]: events = np.zeros(5, dt)
In [34]: events['x'] = np.arange(5)
In [35]: events['y'] = np.array([3,4,0,2,1])
In [36]: events['grayVal'] = np.arange(1,6)
要检查索引,可以制作一个漂亮的二维数组:
In [38]: image = np.arange(25).reshape(5,5)
In [39]: image
Out[39]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
看看ix_
产生什么-2个可以互相广播的阵列。A(5,1)和(1,5),广播到(5,5):
In [40]: np.ix_(events['y'], events['x'])
Out[40]:
(array([[3],
[4],
[0],
[2],
[1]]),
array([[0, 1, 2, 3, 4]]))
使用这些数组进行索引image
只会对值进行混洗-结果仍然是2d数组:
In [41]: image[np.ix_(events['y'], events['x'])]
Out[41]:
array([[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24],
[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[ 5, 6, 7, 8, 9]])
相反,如果我们使用数组而不是数组进行索引ix_
:
In [42]: image[events['y'], events['x']]
Out[42]: array([15, 21, 2, 13, 9])
这只是用产生的数组的对角线ix_
。用(n,)和(n,)数组建立索引会生成(n,)个值数组(与ix_
(n,n)数组相反)。
因此,从零图像开始,我们可以通过以下方式分配值:
In [43]: image= np.zeros((5,5), 'u2')
In [44]: image[events['y'], events['x']]=events['grayVal']
In [45]: image
Out[45]:
array([[0, 0, 3, 0, 0],
[0, 0, 0, 0, 5],
[0, 0, 0, 4, 0],
[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0]], dtype=uint16)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句