gpt4 book ai didi

具有命名字段访问权限的python张量

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:22 25 4
gpt4 key购买 nike

我想在 Python 中使用类似于或优于 R 数组的东西。 R 数组是具有 dimnames 属性的类似张量的对象,它允许直接允许基于名称(字符串)对张量进行子集化。在 numpy 中,recarrays 允许列名,而 pandas 允许灵活有效地对二维数组进行子集化。 Python 中是否有一些东西允许通过使用名称(或者更好的是,在 Python 中可散列和不可变的对象)对 ndarray 进行切片和子集化等类似操作?

最佳答案

这种从字符串列表到索引的快速而肮脏的映射怎么样?您可以使用可调用类清理符号。

def make_dimnames(names):
return [{n:i for i,n in enumerate(name)} for name in names]
def foo(d, *args):
return [d[x] for x in args]

A = np.arange(9).reshape(3,3)
dimnames = [('x','y','z'),('a','b','c')]
Adims = make_dimnames(dimnames)
A[foo(Adims[0],'x','z'),foo(Adims[1],'b')] # A[[0,2],[1]]
A[foo(Adims[0],'x','z'),slice(*foo(Adims[1],'b','c'))] # A[[0,2],slice(1,2)]

或者 R 是否对 dimnames 做了更重要的事情?

一个类稍微压缩了语法:

class bar(object):
def __init__(self,dimnames):
self.dd = {n:i for i,n in enumerate(dimnames)}
def __call__(self,*args):
return [self.dd[x] for x in args]
def __getitem__(self,key):
return self.dd[key]
d0, d1 = bar(['x','y','z']), bar(['a','b','c'])
A[d0('x','z'),slice(*d1('a','c'))]

http://docs.scipy.org/doc/numpy/user/basics.subclassing.html对 ndarray 进行分类,使用添加属性(可以是 dinnames)的简单示例。大概扩展索引以使用该属性应该不难。

numpy/index_tricks__getitem__ 的使用启发,我概括了索引:

class DimNames(object):
def __init__(self, dimnames):
self.dd = [{n:i for i,n in enumerate(names)} for names in dimnames]
def __getitem__(self,key):
# print key
if isinstance(key, tuple):
return tuple([self.parse_key(key, self.dd[i]) for i,key in enumerate(key)])
else:
return self.parse_key(key, self.dd[0])
def parse_key(self,key, dd):
if key is None:
return key
if isinstance(key,int):
return key
if isinstance(key,str):
return dd[key]
if isinstance(key,tuple):
return tuple([self.parse_key(k, dd) for k in key])
if isinstance(key,list):
return [self.parse_key(k, dd) for k in key]
if isinstance(key,slice):
return slice(self.parse_key(key.start, dd),
self.parse_key(key.stop, dd),
self.parse_key(key.step, dd))
raise KeyError

dd = DimNames([['x','y','z'], ['a','b','c']])

print A[dd['x']] # A[0]
print A[dd['x','c']] # A[0,2]
print A[dd['x':'z':2]] # A[0:2:2]
print A[dd[['x','z'],:]] # A[[0,2],:]
print A[dd[['x','y'],'b':]] # A[[0,1], 1:]
print A[dd[:'z', :2]] # A[:2,:2]

我想进一步的步骤是继承 A,添加 dd 作为属性,并更改它的 __getitem__,将符号简化为 A[['x','z'],'b':].

关于具有命名字段访问权限的python张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com