Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将标签数组映射到系列中的值_Python_Arrays_Numpy_Pandas_Vectorization - Fatal编程技术网

Python 将标签数组映射到系列中的值

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'],

这可能是错误的通用方法,但我尝试使用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'],
                  ['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
的方法一样快,并且更具可读性和直观性。