Python 将标签数组映射到系列中的值
这可能是错误的通用方法,但我尝试使用Pandas系列作为一些字符串/标签的numpy数组的查找表:Python 将标签数组映射到系列中的值,python,arrays,numpy,pandas,vectorization,Python,Arrays,Numpy,Pandas,Vectorization,这可能是错误的通用方法,但我尝试使用Pandas系列作为一些字符串/标签的numpy数组的查找表: import pandas as pd import numpy as np data_map = pd.Series([2, 4, 6, 0, 1], index=list('abcde')) lab1d = np.array(['a', 'd', 'd', 'c']) lab2d = np.array([['d', 'e'], ['e', 'd'],
import pandas as pd
import numpy as np
data_map = pd.Series([2, 4, 6, 0, 1], index=list('abcde'))
lab1d = np.array(['a', 'd', 'd', 'c'])
lab2d = np.array([['d', 'e'],
['e', 'd'],
['c', 'a'],
['a', 'b']])
val1d = data_map.loc[lab1d]
val2d = data_map.loc[lab2d]
如果我这样做,val1d
将正确解析为:
a 2
d 0
d 0
c 6
dtype: int64
但是val2d=data\u map.loc[lab2d]
会引发ValueError
:
ValueError: Cannot index with multidimensional key
我想我明白了这不起作用的原因,但是,采取包含索引值的大小(m x n)的numpy.ndarray
并返回(可以转换为)包含相应值的大小(m x n)的numpy.ndarray
的正确方法是什么
编辑
我曾考虑将数据存储在字典中,并使用numpy.vectorize
(如中所示),这无疑是我的退路,但我想澄清的是,我想知道是否有一种方法可以使用某些方法来实现这一点
编辑2
我应该澄清,我实际上是在寻找符合广播规则的东西,例如:
dmd = data_map.to_dict()
make_map = np.vectorize(dmd.__getitem__)
val1d = make_map(lab1d)
val2d = make_map(lab2d)
对于val1d返回:
array([2, 0, 0, 6])
array([[0, 1],
[1, 0],
[6, 2],
[2, 4]])
对于val2d返回:
array([2, 0, 0, 6])
array([[0, 1],
[1, 0],
[6, 2],
[2, 4]])
这里有一个矢量化方法,使用- 样本运行-
>>> data_map = pd.Series([2, 4, 6, 0, 1], index=list('abcde'))
>>> lab1d = np.array(['a', 'd', 'd', 'c'])
>>> lab2d = np.array([['d', 'e'],
... ['e', 'd'],
... ['c', 'a'],
... ['a', 'b']])
>>> data_map[np.searchsorted(np.array(data_map.index),lab1d)]
a 2
d 0
d 0
c 6
dtype: int64
>>> data_map[np.searchsorted(np.array(data_map.index),lab2d)]
array([[0, 1],
[1, 0],
[6, 2],
[2, 4]])
您只需展平阵列,然后重塑形状:
data_map[lab2d.ravel()].reshape(lab2d.shape)
注意:如果我的“编辑2”示例基本上是这样做的“正确”方法,那么我认为这个问题可以作为的副本结束。这看起来不错。与%timeit相比,它比基于字典的查找慢2-3倍,但这看起来基本上是正确的方法,只使用numpy数组和pandas系列。@Paul-Hmm有趣。我真的希望它能快点!也许它会有一个更大的数据集和查找!将被接受的答案转换为这个答案,因为这实际上与基于
dict
的方法一样快,并且更具可读性和直观性。