我有 numpy 陣列:
A = np.array(['abcd','bcde','cdef'])
我需要 A 的哈希陣列:帶函式
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')])
我該怎么做?
uj5u.com熱心網友回復:
基于這個問題,我假設字串是 ASCII 1,并且所有字串的大小都大于 3 個字符。
為了性能和簡單性,您可以首先將字串轉換為 ASCII 字串(通過創建一個新的臨時陣列)。然后,您可以將所有字串合并到一個大陣列中而無需任何副本,這要歸功于視圖(因為 Numpy 字串連續存盤在記憶體中),并且您實際上可以同時將字符轉換為整數(仍然沒有任何副本)。然后您可以使用 stride 以矢量化方式計算所有散列。方法如下:
ascii = A.astype('S')
buff = ascii.view(np.uint8)
result = buff[1::ascii.itemsize]*256 buff[2::ascii.itemsize]
uj5u.com熱心網友回復:
恭喜!速度提升四倍!
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519639.html
標籤:麻木的字符整数
