假設以下 numpy 陣列
>>> z = np.zeros(3, dtype={'names': ("id", "dim1", "cnt1"), 'formats': ('i8', 'S3', 'u8')})
>>> z
array([(0, '', 0L), (0, '', 0L), (0, '', 0L)],
dtype=[('id', '<i8'), ('dim1', 'S3'), ('cnt1', '<u8')])
>>> z["dim1"] = ["foo", "foo", "bar"]
>>>
>>>
>>> z["cnt1"] = [1,2,3]
>>> z
array([(0, 'foo', 1L), (0, 'foo', 2L), (0, 'bar', 3L)],
dtype=[('id', '<i8'), ('dim1', 'S3'), ('cnt1', '<u8')])
我想將每個唯一映射dim1
到一個 ID。在唯一的 dim1 值上使用 for 回圈的一種方法如下:
>>> unique_groups = np.unique(z["dim1"])
>>> groups = z["dim1"]
>>> for idx, ug in enumerate(unique_groups):
... z["id"][ug == groups] = idx
...
>>> z
array([(1, 'foo', 1L), (1, 'foo', 2L), (0, 'bar', 3L)],
dtype=[('id', '<i8'), ('dim1', 'S3'), ('cnt1', '<u8')])
>>>
我想知道是否有辦法在沒有 for 回圈的情況下使用向量操作來代替。我嘗試通過矢量化如下所示的函式來執行它
>>> def map_column(key):
... return m[key]
...
>>> m
{'foo': 1, 'bar': 0}
>>> f = np.vectorize(map_column, otypes=[str])
>>> f(z["dim1"])
array(['1', '1', '0'],
dtype='|S1')
還有其他更有效的方法嗎?在被認為性能更好的兩種方式之間?
uj5u.com熱心網友回復:
您可以使用.searchsorted()
:
In [2]: unique_groups = np.unique(z["dim1"])
In [3]: z["id"] = unique_groups.searchsorted(z["dim1"])
In [4]: z
Out[4]:
array([(1, b'foo', 1), (1, b'foo', 2), (0, b'bar', 3)],
dtype=[('id', '<i8'), ('dim1', 'S3'), ('cnt1', '<u8')])
不確定性能,但可能不會好多少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449869.html