我有麻木数组:
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')])
我怎么才能做到这一点?
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]
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
2条答案
按热度按时间62lalag41#
基于这个问题,我假设字符串是ASCII 1,并且所有字符串的大小都大于3个字符。
出于性能和简单性的考虑,您可以从将字符串转换为ASCII开始(通过创建新的临时数组)。然后,您可以将所有字符串合并到一个大数组中,而不需要任何副本(因为Numpy字符串是连续存储在内存中的),并且您实际上可以同时将字符转换为整数(仍然没有任何副本)。然后,您可以使用STRIDE SO以向量化的方式计算所有散列。以下是操作方法:
g6ll5ycj2#
祝贺你!提速四倍!
产出:
等于=真
DT1=3.37秒,DT2=0.82秒,DT1/DT2=4.11