栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

多维索引和线性索引之间的大量转换

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多维索引和线性索引之间的大量转换

尽管我非常喜欢EOL的答案,但我还是想对每个方向上的仓数不均匀进行概括,并强调C和F排序样式之间的差异。这是一个示例解决方案:

ndims = 5N = 10# Define bin boundaries binbnds = ndims*[None]nbins = []for idim in xrange(ndims):    binbnds[idim] = numpy.linspace(-10.0,10.0,numpy.random.randint(2,15))    binbnds[idim][0] = -float('inf')    binbnds[idim][-1] = float('inf')    nbins.append(binbnds[idim].shape[0]-1)nstates = numpy.cumprod(nbins)[-1]# Define variable values for N particles in ndims dimensionsp = numpy.random.normal(size=(N,ndims))# Assign to bins along each dimensionbinassign = ndims*[None]for idim in xrange(ndims):    binassign[idim] = numpy.digitize(p[:,idim],binbnds[idim]) - 1binassign = numpy.array(binassign)# multidimensional array with elements mapping from multidim to linear index# Two different arrays for C vs F orderinglinind_C = numpy.arange(nstates).reshape(nbins,order='C')linind_F = numpy.arange(nstates).reshape(nbins,order='F')

现在进行转换

# Fast conversion to linear indexb_F = numpy.cumprod([1] + nbins)[:-1]b_C = numpy.cumprod([1] + nbins[::-1])[:-1][::-1]box_index_F = numpy.dot(b_F,binassign)box_index_C = numpy.dot(b_C,binassign)

并检查正确性:

# Checkprint 'Checking correct mapping for each particle F order'for k in xrange(N):    ii = box_index_F[k]    jj = linind_F[tuple(binassign[:,k])]    print 'particle %d %s (%d %d)' % (k,ii == jj,ii,jj)print 'Checking correct mapping for each particle C order'for k in xrange(N):    ii = box_index_C[k]    jj = linind_C[tuple(binassign[:,k])]    print 'particle %d %s (%d %d)' % (k,ii == jj,ii,jj)

为了完整起见,如果您想以快速,矢量化的方式从1d索引返回到多维索引:

print 'Convert C-style from linear to multi'x = box_index_C.reshape(-1,1)bassign_rev_C = x / b_C % nbinsprint 'Convert F-style from linear to multi'x = box_index_F.reshape(-1,1)bassign_rev_F = x / b_F % nbins

并再次检查:

print 'Check C-order'for k in xrange(N):    ii = tuple(binassign[:,k])    jj = tuple(bassign_rev_C[k,:])    print ii==jj,ii,jjprint 'Check F-order'for k in xrange(N):    ii = tuple(binassign[:,k])    jj = tuple(bassign_rev_F[k,:])    print ii==jj,ii,jj


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号