Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python数组切片——如何实现2D数组切片?_Python_Arrays_Slice - Fatal编程技术网

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

我想知道如何在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,因此它将引发一个
语法错误
——因此,您的源文件中不能有该语法。(当您尝试在
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
等等;你得看一下地图才能决定 如何使用切片信息从类中提取所需的数据

为了使它更像一个numpy数组,您还需要覆盖
\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
等等;你得看一下地图才能决定 如何使用切片信息从类中提取所需的数据

为了使它更像一个numpy数组,您还需要覆盖
\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]