我有一个包含一些值的mx1数组a。此外,我有一个nxk数组,比如b,包含0到m之间的索引。
示例:
a = np.array((0.1, 0.2, 0.3))
b = np.random.randint(0, 3, (4, 4))
对于b中的每个索引值,我想从a中获取相应的值。 我可以用循环来做到这一点:
c = np.zeros_like(b).astype('float')
n, k = b.shape
for i in range(n):
for j in range(k):
c[i, j] = a[b[i, j]]
是否有更优雅的内置numpy功能或技巧?这种方法对我来说有点愚蠢。 PS:最初,a和b是Pandas对象,如果有帮助的话。
答案 0 :(得分:16)
>>> a
array([ 0.1, 0.2, 0.3])
>>> b
array([[0, 0, 1, 1],
[0, 0, 1, 1],
[0, 1, 1, 0],
[0, 1, 0, 1]])
>>> a[b]
array([[ 0.1, 0.1, 0.2, 0.2],
[ 0.1, 0.1, 0.2, 0.2],
[ 0.1, 0.2, 0.2, 0.1],
[ 0.1, 0.2, 0.1, 0.2]])
多田!它只是a[b]
。 (另外,您可能希望randint
调用的上限为3
。)
答案 1 :(得分:1)
尝试使用numpy.flatiter
对象进行迭代:
a = np.array((0.1, 0.2, 0.3))
b = np.random.randint(0, 3, (4, 4))
c = np.array([a[i] for i in b.flat]).reshape(b.shape)
print(c)
array([[ 0.2, 0.2, 0.2, 0.1],
[ 0.3, 0.3, 0.2, 0.1],
[ 0.2, 0.1, 0.3, 0.3],
[ 0.3, 0.3, 0.3, 0.1]])