给定列表L = [0,1,2,3,4,5,6,7,8,9]
。访问/提取元素的最佳方法是由numpy阵列给出的索引?令nArr=np.array([0,-1,2,6])
。
结果输出应为另一个列表P = [0,9,2,6]
。
很明显,当元素的形状均匀时,我们可以简单地将其扔进另一个numpy阵列,但是如果不是,该怎么办?例如,M = [np.random.rand(5,5), np.random.rand(1)]
。
库存python具有便利类, itemgetter
:
In [27]: from operator import itemgetter
In [28]: L = [0,1,2,3,4,5,6,7,8,9]
In [29]: nArr=np.array([0,-1,2,6])
In [30]: itemgetter(*nArr)
Out[30]: operator.itemgetter(0, -1, 2, 6)
In [31]: itemgetter(*nArr)(L)
Out[31]: (0, 9, 2, 6)
在内部,它做的是列表理解的等同的事情:
In [33]: [L[x] for x in nArr]
Out[33]: [0, 9, 2, 6]
因此,它不是像数组索引一样快速操作(查看其代码)。它可能是执行sort
或您想定义可获取多个值的key
函数的其他操作的方式最有用的。
https://stackoverflow.com/a/47585659/901925
制作一个随机嵌套列表:
In [54]: arr = np.random.randint(0,10,(4,4))
In [55]: L = arr.tolist()
In [56]: L
Out[56]: [[9, 5, 8, 4], [1, 5, 5, 8], [8, 0, 5, 8], [1, 4, 5, 1]]
词汇排序的"列":
In [57]: sorted(L)
Out[57]: [[1, 4, 5, 1], [1, 5, 5, 8], [8, 0, 5, 8], [9, 5, 8, 4]]
词汇排序由"列" 2和1(按此顺序):
In [59]: sorted(L, key=itemgetter(2,1))
Out[59]: [[8, 0, 5, 8], [1, 4, 5, 1], [1, 5, 5, 8], [9, 5, 8, 4]]
总结注释:列表不支持数组索引,例如 L[nArr]
,其中narr是索引的数组。通常使用列表理解,[L[i] for i in nArr]
。但是,如果愿意,您可以将列表投放到对象的numpy阵列,然后可以将其索引并切成薄片为任何其他numpy数组:
np.array(L, dtype=object)[nArr]
如果要返回列表,则可以:
np.array(L, dtype=object)[nArr].tolist()
,但这并不像列表理解,需要更多的内存,并且很可能不会提高速度。