替换对应于另一个数组的索引数组中的值



我有一个大小[1, x]值的数组A和一个大小为 [1, y] (y> x( 的数组B对应于数组 A 的索引。结果,我想要一个大小C数组[1,y]填充A的值。

下面是输入和输出的示例:

>>> A = [6, 7, 8]
>>> B = [0, 2, 0, 0, 1]
>>> C = #Some operations
>>> C
[6, 8, 6, 6, 7]

当然我可以这样解决:

>>> C = []
>>> for val in B:
>>>     C.append(A[val])

但实际上,我被期望有一个更好的方法来做到这一点。特别是因为我想将其用作另一个函数的参数。一个看起来像A[B](但有效的(的表达式将是理想的。我不介意使用NumPy或熊猫的解决方案。

简单,

列表理解:

A = [6, 7, 8]
B = [0, 2, 0, 0, 1]
C = [A[i] for i in B]
print(C)

这会产生

[6, 8, 6, 6, 7]

用于获取多个项目operator.itemgetter派上用场:

from operator import itemgetter
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]
itemgetter(*B)(A)
# (6, 8, 6, 6, 7)

同样正如您numpy提到的,这可以通过按照您指定的方式索引数组来直接完成,即 A[B]

import numpy as np
A = np.array([6, 7, 8])
B = np.array([0, 2, 0, 0, 1])
A[B]
# array([6, 8, 6, 6, 7])

另一种选择是使用 np.take

np.take(A,B)
# array([6, 8, 6, 6, 7])

这是一种方法,使用 numpy ndarrays:

import numpy as np
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]
C = list(np.array(A)[B]) # No need to convert B into an ndarray
                         # list() is for converting ndarray back into a list,
                         # (if that's what you finally want)
print (C)

解释

  1. 给定一个 numpy ndarray (np.array(A) (,我们可以使用整数数组(恰好正是您喜欢的解决方案的形式是(:用于的整数数组索引到 ndarray 中,不一定是另一个 ndarray。它甚至可以成为一个列表,这也适合我们,因为B发生在一个列表上。所以我们拥有的是:

    np.array(A)[B]
    
  2. 这种索引的结果将是另一个 ndarray,具有 与索引数组相同的形状(维度(。因此,在我们的例子中,作为 我们使用整数索引列表索引到 NDarray 中,即 该索引的结果将是 与索引列表的长度相同。

  3. 最后,如果我们想转换上述结果,从一维 ndarray 回到列表中,我们可以将其作为对list()的论据:

    list(np.array(A)[B])
    

你可以用列表理解来做到这一点:

>>> A = [6, 7, 8]
>>> B = [0, 2, 0, 0, 1]
>>> C = [A[x] for x in B]
>>> print(C)
[6, 8, 6, 6, 7]

我认为你需要一个生成器(列表理解(:

A = [1, 2, 3]
B = [0, 2, 0, 0, 1]
C = [A[i] for i in B]

一旦你使用numpy.array你就能够用你期望的语法做你想做的事情:

>>> a = array([6, 7, 8])
>>> b = array([0, 2, 0, 0, 1])
>>> a[b]
array([6, 8, 6, 6, 7])

最新更新