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)
解释
np.array(a)
),我们可以使用
整数数组(正好是您喜欢的
解决方案的形式是:用于
索引到ndarray,不必是另一个ndarray。它甚至可以
成为一个列表,这也适合我们,因为B
发生在列表上。所以
我们所拥有的是:
np.array(A)[B]
list()
的参数:
虽然你的答案是正确的,但请记住:生成器列表理解。