我有一个大小[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)
解释
给定一个 numpy ndarray (
np.array(A)
(,我们可以使用整数数组(恰好正是您喜欢的解决方案的形式是(:用于的整数数组索引到 ndarray 中,不一定是另一个 ndarray。它甚至可以成为一个列表,这也适合我们,因为B
发生在一个列表上。所以我们拥有的是:np.array(A)[B]
这种索引的结果将是另一个 ndarray,具有 与索引数组相同的形状(维度(。因此,在我们的例子中,作为 我们使用整数索引列表索引到 NDarray 中,即 该索引的结果将是 与索引列表的长度相同。
最后,如果我们想转换上述结果,从一维 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])