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

时间:2019-02-08 14:30:32

标签: python arrays

我有一个大小为A的值数组[1, x]和一个索引为B(y> x)的数组[1, y](对应于数组{{1}) }。因此,我想要一个大小为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

解决方案

6 个答案:

答案 0 :(得分:1)

要获取多个项目,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])

答案 1 :(得分:1)

简单的列表理解功能:

A = [6, 7, 8]
B = [0, 2, 0, 0, 1]

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

这产生

[6, 8, 6, 6, 7]

答案 2 :(得分:0)

您可以通过列表理解来做到这一点:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

一旦使用numpy.array,您就可以使用期望的语法来完成所需的工作:

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

答案 5 :(得分:0)

这是使用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进行索引,     该索引的结果将是该对象的一维ndarray     与索引列表的长度相同。

  3. 最后,如果我们想将上述结果转换为 一维ndarray返回列表,我们可以将其作为 list()的参数:

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