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

Python 替换与另一个数组对应的索引数组中的值,python,arrays,list,numpy,Python,Arrays,List,Numpy,我有一个大小为[1,x]的数组A,和一个大小为[1,y](y>x)的数组B,索引对应于数组A。因此,我需要一个大小为[1,y]的数组C,其中填充A的值 以下是输入和输出的示例: >>> A = [6, 7, 8] >>> B = [0, 2, 0, 0, 1] >>> C = #Some operations >>> C [6, 8, 6, 6, 7] 我当然可以这样解决: >>> C = [] >

我有一个大小为
[1,x]
的数组
A
,和一个大小为
[1,y]
(y>x)的数组
B
,索引对应于数组
A
。因此,我需要一个大小为
[1,y]
的数组
C
,其中填充
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或pandas解决方案。

您可以使用列表理解:

>>> 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]
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]

C = [A[i] for i in B]
print(C)

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


对于获取多个项目,可以方便地使用:

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

itemgetter(*B)(A)
# (6, 8, 6, 6, 7)

同样,正如您所提到的,这可以通过按照您的指定对数组进行索引直接完成,即
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])
另一种选择是使用:


简单的列表理解:

>>> 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]
A = [6, 7, 8]
B = [0, 2, 0, 0, 1]

C = [A[i] for i in B]
print(C)
这就产生了

[6, 8, 6, 6, 7]

使用
numpy.array
后,您就可以使用所需的语法执行所需的操作:

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

这是一种使用numpy Ndarray的方法:

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)
解释

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

    np.array(A)[B]
    
  • 这种索引的结果将是另一个Ndaray,具有 与索引数组的形状(维度)相同。因此,在我们的情况下,作为 我们正在使用整数索引列表将索引编入数据数组 索引的结果将是一个一维的数据数组 与索引列表的长度相同

  • 最后,如果我们想要转换上面的结果,从 一维数组返回到列表中,我们可以将其作为
    list()
    的参数:


  • 虽然你的答案是正确的,但请记住:生成器列表理解。