如何使用字典来翻译/替换数组的元素? [复制]
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 数组,old
和 new
是形状为 (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
语句中。
读到你的答案总是让我大吃一惊,哈哈,有你做这一切很酷!以上是关于如何使用字典来翻译/替换数组的元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章