从numpy数组中获取第n个元素

Lud*_*sed 4 python arrays numpy

假设我有一个 rgb-imagetype 的 numpy 数组,如下所示:

d = [ [ [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, 25 ,26] ] ]
Run Code Online (Sandbox Code Playgroud)

我使用以下命令选择一些随机的 r/g 或 b 像素random

import random
r = random.sample(range(1, len(d)*len(d[0])*3), 3)
# for example r = [25, 4, 15]
Run Code Online (Sandbox Code Playgroud)

那么我该如何选择我想要的数据呢?

就像我想要25th value in array d第一个r_value = 25对应于 的值一样d[2][2][1],因为它是第 25 个值。

hpa*_*ulj 5

您想要做的是将其索引为平面或一维数组。有多种方法可以做到这一点。 ravelreshape(-1)创建 1d 视图,flatten()创建 1d 副本。

\n\n

最有效的是flat迭代器(属性,而不是方法):

\n\n
In [347]: d.flat[25]\nOut[347]: 25\n
Run Code Online (Sandbox Code Playgroud)\n\n

(它也可以在作业中使用,例如d.flat[25]=0..

\n\n
In [341]: idx = [25, 4, 15]\nIn [343]: d.flat[idx]\nOut[343]: array([25,  4, 15])\n
Run Code Online (Sandbox Code Playgroud)\n\n

要找出 3d 索引是什么,有一个实用程序unravel_index(以及相应的ravel_multi_index

\n\n
In [344]: fidx=np.unravel_index(idx,d.shape)\nIn [345]: fidx\nOut[345]: \n(array([2, 0, 1], dtype=int32),\n array([2, 1, 2], dtype=int32),\n array([1, 1, 0], dtype=int32))\nIn [346]: d[fidx]\nOut[346]: array([25,  4, 15])\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个元组,一个元素的索引被“向下”读取,例如(2,2,1)。

\n\n
\n\n

在大型数组上,flat索引实际上要快一些:

\n\n
In [362]: dl=np.ones((100,100,100))\nIn [363]: idx=np.arange(0,1000000,40)\nIn [364]: fidx=np.unravel_index(idx,dl.shape)\nIn [365]: timeit x=dl[fidx]\n1000 loops, best of 3: 447 \xc2\xb5s per loop\nIn [366]: timeit x=dl.flat[idx]\n1000 loops, best of 3: 312 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n