我有一个大小为((s1,…sm))的numpy数组a,其中包含整数条目,还有一个字典D,其中整数作为键,大小为(t))的numpy数组作为值。我想对数组A的每个条目的字典进行评估,以获得大小为(s1,…sm,t)的新数组B。
例如
D={1:[0,1],2:[1,0]}
A=np.array([1,2,1])
输出为
array([[0,1],[1,0],[0,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文档上了解更多关于高级索引的信息
>>> np.asarray([D[key] for key in A])
array([[0, 1],
[1, 0],
[0, 1]])
这里有一种方法,使用np.searchsorted
来定位那些要索引到字典值中的行索引,然后简单地对其进行索引以获得所需的输出,比如so-
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]])