如何使用numpy阵列访问列表的条目而不使用for循环



给定列表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()

,但这并不像列表理解,需要更多的内存,并且很可能不会提高速度。

很可能不会提高速度。

最新更新