numpy 制作数字数组,它是字符串数组的哈希

js4nwp54  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(123)

我有麻木数组:

A = np.array(['abcd','bcde','cdef'])

我需要A:WITH函数的散列数组

B[i] = ord(A[i][1]) * 256 + ord(A[i][2])

B = np.array([ord('b') * 256 + ord('c'), ord('c') * 256 + ord('d'), ord('d') * 256 + ord('e')])

我怎么才能做到这一点?

62lalag4

62lalag41#

基于这个问题,我假设字符串是ASCII 1,并且所有字符串的大小都大于3个字符。
出于性能和简单性的考虑,您可以从将字符串转换为ASCII开始(通过创建新的临时数组)。然后,您可以将所有字符串合并到一个大数组中,而不需要任何副本(因为Numpy字符串是连续存储在内存中的),并且您实际上可以同时将字符转换为整数(仍然没有任何副本)。然后,您可以使用STRIDE SO以向量化的方式计算所有散列。以下是操作方法:

ascii = A.astype('S')
buff = ascii.view(np.uint8)
result = buff[1::ascii.itemsize]*256 + buff[2::ascii.itemsize]
g6ll5ycj

g6ll5ycj2#

祝贺你!提速四倍!

import time
import numpy as np
Iter = 1000000
A = np.array(['abcd','bcde','cdef','defg'] * Iter)

Ti = time.time()
B = np.zeros(A.size)
for i in range(A.size):
    B[i] = ord(A[i][1]) * 256 + ord(A[i][2])
DT1 = time.time() - Ti    

Ti = time.time()
ascii = A.astype('S') 
buff = ascii.view(np.uint8)
result = buff[1::ascii.itemsize]*256 + buff[2::ascii.itemsize]
DT2 = time.time() - Ti

print("Equal = %s" % np.array_equal(B, result))
print("DT1=%7.2f Sec, DT2=%7.2f Sec, DT1/DT2=%6.2f" % (DT1, DT2, DT1/DT2))

产出:
等于=真
DT1=3.37秒,DT2=0.82秒,DT1/DT2=4.11

相关问题