2016-07-20 84 views
1

我有一个大小为((s1,... sm))的numpy数组A,其中包含整数项和一个字典D,整数作为键和大小为((t)的numpy数组)作为价值观。我想评估数组A的每个条目上的字典以获得大小为((s1,... sm,t))的新数组B.用numpy数组替换numpy数组的条目

例如

D={1:[0,1],2:[1,0]} 
A=np.array([1,2,1]) 

输出喊是

array([[0,1],[1,0],[0,1]]) 

动机:我与单位矢量作为条目的索引的阵列,并且我需要将其与向量作为变换成阵列条目。

回答

1

如果可以重命名你的钥匙是0指数的,你可能会使用直接序列查询您的单位向量:

>>> units = np.array([D[1], D[2]]) 
>>> B = units[A - 1] # -1 because 0 indexed: 1 -> 0, 2 -> 1 
>>> B 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 

同样地,对于任何形状:

>>> A = np.random.random_integers(0, 1, (10, 11, 12)) 
>>> A.shape 
(10, 11, 12) 
>>> B = units[A] 
>>> B.shape 
(10, 11, 12, 2) 

您可以了解更多关于在numpy doc

+0

非常优雅 - 谢谢! – fact

0

下面是使用np.searchsorted那些行索引来索引查找到字典的值,然后简单地编入索引,以获得所需的输出,像这样的做法 -

idx = np.searchsorted(D.keys(),A) 
out = np.asarray(D.values())[idx] 

采样运行 -

In [45]: A 
Out[45]: array([1, 2, 1]) 

In [46]: D 
Out[46]: {1: [0, 1], 2: [1, 0]} 

In [47]: idx = np.searchsorted(D.keys(),A) 
    ...: out = np.asarray(D.values())[idx] 
    ...: 

In [48]: out 
Out[48]: 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
0
>>> np.asarray([D[key] for key in A]) 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
+0

高级索引尽管此代码可能会帮助解决问题,提供有关_why_额外的内容及/或它如何回答这个问题会显着提高其长期价值。请[编辑]你的答案,添加一些解释。 –