【问题标题】:How to access entries of a list using a numpy array without using a for loop如何在不使用 for 循环的情况下使用 numpy 数组访问列表的条目
【发布时间】:2017-12-05 22:15:51
【问题描述】:

给定一个列表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)]

【问题讨论】:

  • [L[i] for i in nArr]?
  • 我应该提到,不使用 for 循环。
  • @RakshitKothari 嗯,你为什么不能使用 for 循环?
  • 你不会得到比列表理解更好的东西。
  • @roganjosh 是的,因为元素可以有不同的大小。

标签: python arrays list numpy


【解决方案1】:

Stock 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]]

【讨论】:

    【解决方案2】:

    总结 cmets:列表不支持按数组索引,例如 L[nArr] 其中 nArr 是索引数组。通常使用列表理解,[L[i] for i in nArr]。但是,如果您愿意,可以将列表转换为 objects 的 NumPy 数组,然后可以像任何其他 NumPy 数组一样对其进行索引和切片:

    np.array(L, dtype=object)[nArr]
    

    如果你想返回一个列表,你可以这样做:

    np.array(L, dtype=object)[nArr].tolist()
    

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

    【讨论】:

    • 我认为 Crazy Ivan 的意思是 np.array(L, dtype=object)[nArr]。或者这也可以np.array(L)[nArr]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2019-10-10
    • 2018-10-15
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多