我想用numpy来解决一个与纽比。重复功能。我不知道如何使用我熟悉的numpy函数来解决这个问题,所以我正在寻找帮助,看看这是否可以用numpy来完成。我的数组很大(>;1e6个元素),高性能至关重要,因此我无法承受python for循环的性能损失。在
我有一个length-num pts排序整数数组objID
,它存储(可能重复)对象标识符。在
objID = np.array([0, 0, 5, 5, 5, 7, 8, 8])
使用cd1}的唯一索引来确定它们的唯一索引纽比。独一无二. 在
^{2}$我还有一个length-num惟一的objIDs数组occupations
,它指定我要从objID
中选择unique_objIDs
的每个条目多少次。在
occupations = np.array([0, 2, 1, 2])
我想根据occupations
来确定索引数组,用于检索objID
的元素。我在下面举一个具体的例子。在
desired_array_of_indices = np.array([2, 3, 5, 6, 7])
数组desired_array_of_indices
就是我想用numpy来计算的。desired_array_of_indices
的条目计算如下。在
desired_array_of_indices
的显式解释occupations
数组的Element-i指定选择unique_objID[i]
的次数。desired_array_of_indices
数组存储这些选择的objID
的索引。对于多次选择的objID
的值,选择objID
的连续索引,这样就不会重复存储在desired_array_of_indices
中的索引。在
具体来说,考虑occupations
的第一个元素。该值为零,它告诉我们,我们不想选择存储unique_objIDs[0]=0
的objID
的任何索引,因此所有这些索引都被排除在desired_array_of_indices
之外。在
occupations
的下一个元素是2,告诉我们要选择unique_objIDs[1]=5
在objID
中的前两个出现的索引。这就是desired_array_of_indices
的前两个条目是2和3的原因。在
occupations
的下一个元素是1,告诉我们要选择unique_objIDs[2]=7
在objID
中第一次出现的索引。所以desired_array_of_indices
的下一个条目是5。在
occupations
的最后一个元素是2,它告诉我们要选择unique_objIDs[3]=8
在objID
中的前2个出现的索引。这就是desired_array_of_indices
的最后两个条目是6和7的原因。在
注意这个计算和numpy.repeat
之间的细微差别。对于numpy.repeat
,返回的索引属于唯一项数组unique_objIDs
。这里我需要objID
的索引,我还需要为重复条目的情况选择连续的索引。可以假定occupations
的每个条目小于或等于相应条目在objID
中出现的总次数,因此不存在索引错误的危险。在
有人知道如何用可用的向量化Numpy函数(可能是一些集合)来表述这个问题吗?在
另一个建议是用
return_counts
代替return_index
:有一个办法。在
首先,您的示例代码:
[[注意:
^{pr2}$unique()
对其参数进行排序。您知道您的输入已经被排序,因此获取idx_unique_objIDs
的更有效方法是:此操作是O(n),而不是
unique
所需的O(n*log(n))。然后可以使用如果需要唯一对象ID数组。]]
现在找到所需的指数。结果在
Out[107]
行中:仔细观察:
csum
是occupations
的累计和,n
是{csum
可以解释为与每个职业相关联的指数范围的结束。然后csum - occupations
保存范围开始的索引:根据
occupations
中的值重复这些起始索引:如果从
np.arange(n)
中减去这个值,那么对于每个职业k
,我们有一个从0到occupation[k]-1
的范围串联在一个数组中:那不是理想的结果。我们必须添加(repeated)
idx_unique_objIDs
,使值成为数组objID
的索引:现在将这两个
repeat()
调用组合起来,得到最终表达式:相关问题 更多 >
编程相关推荐