Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在包含非数值项的非唯一数组中查找唯一数组的索引_Python_Arrays_Numpy_Out Of Memory - Fatal编程技术网

Python 在包含非数值项的非唯一数组中查找唯一数组的索引

Python 在包含非数值项的非唯一数组中查找唯一数组的索引,python,arrays,numpy,out-of-memory,Python,Arrays,Numpy,Out Of Memory,我有以下数组: import numpy as np a = np.array(['a', 'b', 'c','a','a','d','e']) b = np.array(['a','b']) 存储在阵列中的实际数据是UUID,例如: 123e4567-e89b-12d3-a456-426614174000 我想在a中搜索b并获得索引: array([0, 3, 4, 1]) 此解决方案适用于我: np.nonzero(b[:, None] == a)[1] 但问题是我处理的是巨大的数组

我有以下数组:

import numpy as np
a = np.array(['a', 'b', 'c','a','a','d','e'])
b = np.array(['a','b'])
存储在阵列中的实际数据是UUID,例如:

123e4567-e89b-12d3-a456-426614174000
我想在a中搜索b并获得索引:

array([0, 3, 4, 1])
此解决方案适用于我:

np.nonzero(b[:, None] == a)[1]
但问题是我处理的是巨大的数组(非唯一数组为15M,唯一子数组为150k,str_uu类型),因此对于给定的操作,我需要1.8TB的内存,而我没有

你知道我该如何解决这个问题,或者用我自己的解决方案解决内存限制吗


谢谢。

因为索引的顺序实际上并不相关,所以您可以使用,然后在结果上检索返回数组为True的索引:

a = np.array(['a', 'b', 'c','a','a','d','e'])
b = np.array(['a','b'])

np.flatnonzero(np.isin(a,b))
# array([0, 1, 3, 4], dtype=int64)
与广播方法不同(
O(len(a)*len(b))
),即使问题中提到了阵列大小,这种方法也应该相当快且内存效率高(
O(len(a))

a = np.random.randint(0,15e2,int(15e6))
b = np.random.randint(0,150e3,int(150e3))

%timeit np.flatnonzero(np.isin(a,b))
# 2.58 s ± 28.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

这是一个基于
查看
+
查找
-

def map_indices_conststring(a, b):
    a2D = a.view(np.uint8)[::4].reshape(len(a),-1)
    b2D = b.view(np.uint8)[::4].reshape(len(b),-1)
    
    n = b2D.shape[1]
    lookup = np.zeros(256, dtype=bool)
    mask = np.ones(len(a), dtype=bool)
    for i in range(n):
        lookup[b2D[:,i]] = 1
        mask &= lookup[a2D[:,i]]
    out = np.flatnonzero(mask)
    return out
样本运行-

In [46]: a
Out[46]: 
array(['a123', 'b232', 'c434', 'b235', 'a123', 'd223', 'b232'],
      dtype='<U4')

In [47]: b
Out[47]: array(['a123', 'b232'], dtype='<U4')

In [48]: map_indices_conststring(a, b)
Out[48]: array([0, 1, 4, 6])

它们都是一个字符串吗?不,实际上它更像是一个长的唯一标识符:“abd2-ffb3-ffv3-dda1”(类似于此),那么,所有字符串都是相同长度的吗?是的,它们是相同长度的。这是一个uuidAlso,您是否需要以
数组([0,3,4,1])的特定顺序输出,或者排序的
数组([0,1,3,4])
可以吗?
In [2]: a = np.random.randint(10000000000,99999999999,(1500000)).astype(str)

In [3]: b = np.unique(np.random.randint(10000000000,99999999999,(15000)).astype(str))

In [4]: %timeit map_indices_conststring(a, b)
266 ms ± 2.63 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# @yatu's soln
In [5]: %timeit np.flatnonzero(np.isin(a,b))
1.03 s ± 3.75 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)