Python,建立索引并分配给Np数组

丹尼尔·克劳瑟(Daniel Klauser)

为了提高速度,我想避免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” =图像数组的列。

问题是:如何将grayValin分配Events给allxyin 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)

我想念什么?谢谢您的帮助。

hpaulj

让我们来看一个小例子,一个我们可以实际研究和使用的例子!

制作结构化数组:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章