繁体   English   中英

根据标签扩展numpy数组

[英]Extend numpy array based on tags

如果我有

a1 = np.array([1,2,3,4])
a2 = np.array(list('abcd'))
b2 = np.array(list('aabcccdd'))

我如何到达b1应该是

array([1, 1, 2, 3, 3, 3, 4, 4])

编辑:换句话说, a1值对应于a2 '标签',我想生成对应于b2的值。

假设要对a2进行排序,这是使用np.searchsorted的一个-

a1[np.searchsorted(a2,b2)]

样品运行-

In [145]: a1 = np.array([1,2,3,4])
     ...: a2 = np.array(list('abcd'))
     ...: b2 = np.array(list('aabbccdd'))
     ...: 

In [146]: a1[np.searchsorted(a2,b2)]
Out[146]: array([1, 1, 2, 2, 3, 3, 4, 4])

对于a2未排序的一般情况,我们需要引入sorter参数-

In [148]: np.random.shuffle(a2)

In [149]: a2
Out[149]: 
array(['b', 'd', 'c', 'a'], 
      dtype='|S1')

In [152]: sidx = a2.argsort()

In [155]: a1[sidx[np.searchsorted(a2,b2, sorter=sidx)]]
Out[155]: array([4, 4, 1, 1, 3, 3, 2, 2])

Numpys内置函数numpy.repeatnumpy.tile非常适合此类工作。

例:

import numpy as np
arr = np.array((1, 2, 3, 4))
print(arr)
[1, 2, 3, 4]

print(numpy.repeat(arr, 2))
[1, 1, 2, 2, 3, 3, 4, 4]

print(numpy.tile(arr, 2))
[1, 2, 3, 4, 1, 2, 3, 4]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM