如何使用字典来翻译/替换数组的元素? [复制]

Posted

技术标签:

【中文标题】如何使用字典来翻译/替换数组的元素? [复制]【英文标题】:How to use a dictionary to translate/replace elements of an array? [duplicate] 【发布时间】:2016-02-05 09:42:12 【问题描述】:

我有一个 numpy 数组,它有数百个大写字母元素,没有特定的顺序

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J', ...])

numpy.ndarray 中的每个元素都是一个numpy.string_

我还有一个“翻译词典”,其中包含键/值对,大写字母对应一个城市

transdict = 'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne',...

transdict 字典里只有 26 对,但是我必须翻译的 numpy 数组中有数百个字母。

最有效的方法是什么?

我考虑过使用numpy.core.defchararray.replace(a, old, new, count=None)[source],但这会返回ValueError,因为numpy 数组的大小与字典键/值不同。

AttributeError: 'numpy.ndarray' object has no attribute 'translate'

【问题讨论】:

您是否尝试过任何有效的代码,是否效率低下?样本数据的预期输出是什么? @Divakar 实际上,我最好的猜测是使用numpy.core.defchararray.replace(),但这不起作用。所以是的,我不知道该怎么办。 对于old,你需要使用transdict.keys(),对于new你需要使用transdict.values(),那么.replace(abc_array, old, new)应该可以工作 @ChadS。我也是这么想的,但事实并非如此。 abc_array 是形状为 (700,1) 的 numpy 数组,oldnew 是形状为 (26,1) 的 numpy 数组 @ChadS。我收到广播错误:ValueError: shape mismatch: objects cannot be broadcast to a single shape 【参考方案1】:

这样可以吗?有时,纯 Python 是处理此类事情的一种很好、直接的方法。下面构建了一个翻译列表(很容易转换回一个 numpy 数组)和连接的输出。

import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J'])

transdict = 'A': 'Adelaide',
             'B': 'Bombay',
             'C': 'Cologne',
             'D': 'Dresden',
             'E': 'Erlangen',
             'F': 'Formosa',
             'G': 'Gdansk',
             'H': 'Hague',
             'I': 'Inchon',
             'J': 'Jakarta',
             'Z': 'Zambia'


phoenetic = [transdict[letter] for letter in abc_array]
print ' '.join(phoenetic)

由此产生的输出是:

Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta

【讨论】:

我认为你是对的; Python for 循环是要走的路。 很好......但你可能会等待其他想法,尤其是纯 numpy 的想法。一旦你有了一个好的解决方案,别忘了“接受”你最喜欢的。【参考方案2】:

使用 蛮力 NumPy broadcasting -

idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
out = np.asarray(transdict.values())[idx]

使用基于 np.searchsorted 的搜索和索引 -

sort_idx = np.argsort(transdict.keys())
idx = np.searchsorted(transdict.keys(),abc_array,sorter = sort_idx)
out = np.asarray(transdict.values())[sort_idx][idx]

示例运行 -

In [1]: abc_array = np.array(['B', 'D', 'A', 'B', 'D', 'A', 'C'])
   ...: transdict = 'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne', 'D': 'Delhi'
   ...: 

In [2]: idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
   ...: out = np.asarray(transdict.values())[idx]
   ...: 

In [3]: out
Out[3]: 
array(['Bombay', 'Delhi', 'Adelaide', 'Bombay', 'Delhi', 'Adelaide',
       'Cologne'], 
      dtype='|S8')

In [4]: sort_idx = np.argsort(transdict.keys())
   ...: idx = np.searchsorted(transdict.keys(),abc_array,sorter = sort_idx)
   ...: out = np.asarray(transdict.values())[sort_idx][idx]
   ...: 

In [5]: out
Out[5]: 
array(['Bombay', 'Delhi', 'Adelaide', 'Bombay', 'Delhi', 'Adelaide',
       'Cologne'], 
      dtype='|S8')

【讨论】:

您不是刚刚用 searchsorted 回答了另一个字典问题吗? :) @hpaulj 这不是很有趣吗!? ;) NumPythonic 一切 :) 令我惊讶的事情。第一种方法将在带有无用错误消息的大型数据结构上失败。据我所知,== 开始返回 True/False 超过某个限制而不是广播。 对于 Python 3,keys()values() 都必须包含在 list 语句中。 读到你的答案总是让我大吃一惊,哈哈,有你做这一切很酷!

以上是关于如何使用字典来翻译/替换数组的元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何实现两个数组之间值的替换

如何使用字典查找替换列表中的元素

如何编写正则表达式来查找/替换 HTML 类? [复制]

如何从字典中删除特定元素? [复制]

如何使用javascript替换textarea元素中的文本? [复制]

如果字典元素为空,如何过滤字典数组?