Python数组切片——如何实现2D数组切片?
我想知道如何在Python中实现2D数组切片 比如说,Python数组切片——如何实现2D数组切片?,python,arrays,slice,Python,Arrays,Slice,我想知道如何在Python中实现2D数组切片 比如说, arr是自定义类2D数组的实例 如果要在此对象上启用2D切片语法,如下所示: arr[:,1:3] #retrieve the 1 and 2 column values of every row 或 用法和语法与numpy.array类似。但是这种功能怎么能靠我们自己实现呢 PS: 我的想法是: 对于第一种情况,[:,1:3]部分类似于两个切片的元组 但是,对于第二种情况,[,1:3]似乎非常神秘。obj[,:3]不是有效的python
arr
是自定义类2D数组的实例
如果要在此对象上启用2D切片语法,如下所示:
arr[:,1:3] #retrieve the 1 and 2 column values of every row
或
用法和语法与numpy.array类似。但是这种功能怎么能靠我们自己实现呢
PS:
我的想法是:
对于第一种情况,[:,1:3]
部分类似于两个切片的元组
但是,对于第二种情况,
[,1:3]
似乎非常神秘。obj[,:3]
不是有效的python,因此它将引发一个语法错误
——因此,您的源文件中不能有该语法。(当您尝试在numpy
数组上使用它时,它也会失败)obj[,:3]
不是有效的python,因此它会引发语法错误
——因此,您的源文件中不能有该语法。(当您尝试在numpy
数组上使用它时,它也会失败)如果您想了解数组切片的规则,下面的图片可能会有所帮助:
如果您想了解数组切片的规则,下面的图片可能会有所帮助:
如果这是你自己的课程,并且你愿意以字符串形式通过,那么这里有一个hack
这是一个黑客,如果它是你自己的类,你愿意通过一个字符串
对于读取访问,您需要覆盖
\uuu getitem\uu
方法:
class ArrayLike(object):
def __init__(self):
pass
def __getitem__(self, arg):
(rows,cols) = arg # unpack, assumes that we always pass in 2-arguments
# TODO: parse/interpret the rows/cols parameters,
# for single indices, they will be integers, for slices, they'll be slice objects
# here's a dummy implementation as a placeholder
return numpy.eye(10)[rows, cols]
其中一个棘手的问题是\uuuu getitem\uuuu
总是只使用一个参数(除了self),
当您将多个逗号分隔的项放在方括号内时,实际上您提供了一个元组作为\uuuu getitem\uuuu
调用的参数;因此,有必要
将此元组解包(并可选地验证元组的长度是否合适)到
功能
现在给定a=ArrayLike()
,您将得到
表示a[2,3]
,rows=2
cols=3
表示a[:3,2]
,rows=slice(None,3,None)
cols=3
\uuuu setitem\uuuu
,以
允许分配给元素/片。对于读取访问,您需要覆盖
\uuu getitem\uuu
方法:
class ArrayLike(object):
def __init__(self):
pass
def __getitem__(self, arg):
(rows,cols) = arg # unpack, assumes that we always pass in 2-arguments
# TODO: parse/interpret the rows/cols parameters,
# for single indices, they will be integers, for slices, they'll be slice objects
# here's a dummy implementation as a placeholder
return numpy.eye(10)[rows, cols]
其中一个棘手的问题是\uuuu getitem\uuuu
总是只使用一个参数(除了self),
当您将多个逗号分隔的项放在方括号内时,实际上您提供了一个元组作为\uuuu getitem\uuuu
调用的参数;因此,有必要
将此元组解包(并可选地验证元组的长度是否合适)到
功能
现在给定a=ArrayLike()
,您将得到
表示a[2,3]
,rows=2
cols=3
表示a[:3,2]
,rows=slice(None,3,None)
cols=3
\uuuu setitem\uuuu
,以
允许分配给元素/片。如果您正在实现一个类似于numpy类的类,并且想要类似的行为,为什么不检查它们的代码呢?您想要自己实现,还是想知道如何实现?如果您正在实现一个类似于numpy类的类,并且想要类似的行为,为什么不检查他们的代码呢?你想自己实现,还是想知道如何实现?我想我们总是希望他们在python4.0系列中添加这种语法…啊,谢谢你提醒错误!我想我现在有线索了!诚然,
obj[,:3]
是无效的语法,但您可以同时实现obj[,:3]
或obj[None,:3]
,因为这些都是有效的语法……笑话我想我们总是希望他们在python4.0系列中添加这种语法……啊,谢谢提醒这些错误!我想我现在有线索了!是的,obj[,:3]
是无效语法,但您可以同时实现obj[:,:3]
或obj[None,:3]
,因为它们是有效语法。。。。
class ArrayLike(object):
def __init__(self):
pass
def __getitem__(self, arg):
(rows,cols) = arg # unpack, assumes that we always pass in 2-arguments
# TODO: parse/interpret the rows/cols parameters,
# for single indices, they will be integers, for slices, they'll be slice objects
# here's a dummy implementation as a placeholder
return numpy.eye(10)[rows, cols]