Sha*_*ang 5 python arrays dictionary numpy
我有一个numpy数组,它有数百个大写字母元素,没有特别的顺序
import numpy as np
abc_array = np.array(['B', 'D', 'A', 'F', 'H', 'I', 'Z', 'J', ...])
Run Code Online (Sandbox Code Playgroud)
这里的每个元素numpy.ndarray
都是numpy.string_
.
我还有一个"翻译词典",其中键/值对使得大写字母对应于一个城市
transdict = {'A': 'Adelaide', 'B': 'Bombay', 'C': 'Cologne',...}
Run Code Online (Sandbox Code Playgroud)
字典中只有26对transdict
,但是我必须翻译的numpy数组中有数百个字母.
最有效的方法是什么?
我考虑过使用numpy.core.defchararray.replace(a, old, new, count=None)[source]
但是这会返回一个ValueError
,因为numpy数组与字典键/值的大小不同.
AttributeError: 'numpy.ndarray' object has no attribute 'translate'
这会吗?有时,纯 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)
Run Code Online (Sandbox Code Playgroud)
输出结果是:
Bombay Dresden Adelaide Formosa Hague Inchon Zambia Jakarta
Run Code Online (Sandbox Code Playgroud)
随着蛮力 NumPy broadcasting
-
idx = np.nonzero(transdict.keys() == abc_array[:,None])[1]
out = np.asarray(transdict.values())[idx]
Run Code Online (Sandbox Code Playgroud)
使用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]
Run Code Online (Sandbox Code Playgroud)
样品运行 -
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')
Run Code Online (Sandbox Code Playgroud)