Python Numpy:基于字典转换一维数组中的值

Python Numpy:基于字典转换一维数组中的值,python,arrays,numpy,dictionary,Python,Arrays,Numpy,Dictionary,我有以下数组和字典 >>> data = ['a', 'b', 'a', 'a'] >>> mapping = {'a': 9, 'b': 0} 我想应用一个函数,根据此输入字典将np.array(['a','b','a','a']转换为np.array([9,0,9,9])。但我想将此操作矢量化。如果不使用for循环,如何实现此转换 请注意,和都不起作用,因为它们要求输入数组是二维的 编辑:请注意,我正在使用的实际数据集非常大,这里的数据集只是一个简单的示

我有以下数组和字典

>>> data = ['a', 'b', 'a', 'a']
>>> mapping = {'a': 9, 'b': 0}
我想应用一个函数,根据此输入字典将
np.array(['a','b','a','a']
转换为
np.array([9,0,9,9])
。但我想将此操作矢量化。如果不使用
for循环
,如何实现此转换

请注意,和都不起作用,因为它们要求输入数组是二维的


编辑:请注意,我正在使用的实际数据集非常大,这里的数据集只是一个简单的示例。

如何简单地调用
映射

>>> data = ['a', 'b', 'a', 'a']
>>> mapping = {'a': 9, 'b': 0}
>>> map(lambda x: mapping[x], data)
[9, 0, 9, 9]

这不使用numpy,而且如果阵列很大,速度也不会非常快,但它很简单,在遇到性能问题之前可能不需要担心

首先,定义一些示例数据:

In [36]: data = np.array(['a', 'b', 'a', 'a', 'c', 'b'])

In [37]: mapping = {'a': 9, 'b': 0, 'c': 5}
您可以使用
numpy.unique
获取
数据中的唯一元素,以及(更重要的是)将这些唯一值映射回输入数组的数组:

In [38]: keys, inv = np.unique(data, return_inverse=True)
此时,
keys[inv]
将重新创建
数据
。但我们希望创建映射数组,因此我们将在
mapping
中创建一个值数组,其顺序与
np返回的键相同。unique

In [39]: vals = np.array([mapping[key] for key in keys])
现在,我们可以使用
inv
索引
vals
,以获得所需的结果:

In [40]: result = vals[inv]

In [41]: result
Out[41]: array([9, 0, 9, 9, 5, 0])
另一种方法(这是一种相当简单的方法)是简单地在
映射中循环键,并将值矢量化分配到一个新数组中:

In [42]: result = np.empty(data.size, dtype=int)

In [43]: for key, val in mapping.items():
   ....:     result[data == key] = val
   ....:     

In [44]: result
Out[44]: array([9, 0, 9, 9, 5, 0])
如果不了解更多关于
数据的实际大小以及
映射中的键数,很难说哪种方法更有效

下面是一个您可能不想使用的方法,因为由表达式
data.reformate(-1,1)=keys
形成的二维中间数组将具有shape
(len(数据),len(映射))


正确,这将是一个快速的方法。但是正如你所承认的,这个解决方案只有在数据集很小的情况下才有效,我正在处理大数据集。熊猫。也许你可以试试。“非常大”有点模糊。一百万?十亿?比十亿多得多?还有,大概有多少键将
mapping
映射?你浏览过numpy或scipy文档,看看是否有解决方案吗?@WarrenWeckesser:只是一个足够大的数据集,几乎无法放入我的RAM。(我正在为退化的情况做准备,在这种情况下,我需要为10亿行的数据集做准备。)@wwii:是的。否则,我就不知道函数
np。沿轴应用,也不
np。在轴上应用。我最喜欢你的第二个答案(在
映射上调用for循环。items()
),谢谢。
In [63]: keys = np.array(mapping.keys())

In [64]: vals = np.array(mapping.values())

In [65]: result = vals[(data.reshape(-1, 1) == keys).nonzero()[1]]

In [66]: result
Out[66]: array([9, 0, 9, 9, 5, 0])