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 个值。
您想要做的是将其索引为平面或一维数组。有多种方法可以做到这一点。 ravel并reshape(-1)创建 1d 视图,flatten()创建 1d 副本。
最有效的是flat迭代器(属性,而不是方法):
In [347]: d.flat[25]\nOut[347]: 25\nRun Code Online (Sandbox Code Playgroud)\n\n(它也可以在作业中使用,例如d.flat[25]=0..
In [341]: idx = [25, 4, 15]\nIn [343]: d.flat[idx]\nOut[343]: array([25, 4, 15])\nRun Code Online (Sandbox Code Playgroud)\n\n要找出 3d 索引是什么,有一个实用程序unravel_index(以及相应的ravel_multi_index)
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])\nRun Code Online (Sandbox Code Playgroud)\n\n这是一个元组,一个元素的索引被“向下”读取,例如(2,2,1)。
\n\n在大型数组上,flat索引实际上要快一些:
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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
22100 次 |
| 最近记录: |