我需要编写一个从2D数组返回单行或单列的函数.函数的输入告诉我们要返回什么.

# 3x3 array with values 1 to 9
a = np.arange(1, 10).reshape(3,3)
rowCount, colCount = a.shape

# return last row [7, 8, 9]
a[rowCount - 1, :]

# return first row [1, 2, 3]
a[0, :]

# return last column [3, 6, 9]
a[:, lastCol]

# return first column [1, 4, 7]
a[:, 0]

如何在函数中执行此操作,以便该函数接收要返回的行或列?

就像这样,

def getSlice(slice):
    return a[slice]

其中slice object是使用内置slice function创建的.

然而,我不知道如何为2D数组创建切片对象,因为slice函数不接受像slice(0, :)一样的冒号运算符.

另外,如果我事先不知道2D数组的形状,有没有办法表示"最后一行"或"最后一列"?

用例

下面是我为什么需要一个函数而不是直接使用a[:, 0]表达式的几个用例:

  1. 调用方无权访问该array.调用方可以通过调用getSlice函数从数组中获取所需的行或列.
  2. 需要预先配置首选的行或列.例如,{a1: 'first row', a2: 'last column'}.a1a2都可能被多次移位和修改.但在任何时候,我都只对两个数组的配置行/列感兴趣.

推荐答案

我会试着把你的问题分解一下:

我想不出如何为2D数组创建切片对象,因为Slice函数不接受像slice(0, :)这样的冒号运算符

实际上,这是行不通的,因为slice对象不是这样工作的:它们表示沿one dimension的索引范围,而您想要沿two dimensions索引.因此,虽然这不适用于单个slice对象,但您可以使用元组-比较文档here,特别是第Slicing and striding节的最后一个项目符号:

切片元组始终可以构造为obj,并在x[obj]表示法中使用.切片对象可以在构造中用来代替[start:stop:step]表示法.例如,x[1:10:5, ::-1]也可以实现为obj = (slice(1, 10, 5), slice(None, None, -1)); x[obj].

在您的情况下,因为您只要求完整的行和列:

我需要编写一个从2D数组返回单行或单列的函数.

…相应的:可以写成slice(None, None, None).事实上,您甚至不需要显式地创建切片元组,因为您只有两个索引(一个用于行,一个用于列,它们都是:),您可以直接使用它们来索引array.因此,如果您真的想将索引打包到一个函数中,我将创建一个函数,如下所示:

def get_slice(row=slice(None,None,None), col=slice(None,None,None)):
    return a[row, col]  # or, equivalently a[(row, col)]

在这里,我们将提供:或等价的slice(None,None,None)作为行和列的缺省值,这样用户只需要为他们真正感兴趣的索引传递一个值.当然,您也可以调整函数,以便接受元组,这将更接近您的原始代码.

在任何情况下,上述版本都将为您提供:

print(get_slice(row=0))  # First row
# >>> [1 2 3]
print(get_slice(col=-1))  # Last column
# >>> [3 6 9]
print(get_slice(col=0))  # First column
# >>> [1 4 7]

最后:

另外,有没有一种方法来表示"最后一行"或"最后一列"…?

您可以使用negative indexing来实现这一点,我已经在上面的示例中的最后一个专栏中使用了它.负索引的工作方式是"从右开始"或"从下开始",因此a[-1]指的是最后一行,a[:, -2]指的是倒数第二列,依此类推,不需要知道数组的实际形状.

Python相关问答推荐

使用pandas MultiIndex进行不连续 Select

计算每月过go x年的平均值

在Python中添加期货之间的延迟

解析讨论论坛只给我第一个用户 comments ,但没有给我其他用户回复

想要使用Polars groupby_Dynamic来缩减时间序列收件箱(包括空垃圾箱)

如何使用函数正确索引收件箱?

如何在telegram 机器人中发送音频?

在Python中使用一行try

如何知道标志是否由用户传递或具有默认值?

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

过滤绕轴旋转的螺旋桨

在Pandas框架中截短至固定数量的列

如何在BeautifulSoup中链接Find()方法并处理无?

如何自动抓取以下CSV

如何将双框框列中的成对变成两个新列

在Mac上安装ipython

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

如何合并两个列表,并获得每个索引值最高的列表名称?

为什么if2/if3会提供两种不同的输出?

剪切间隔以添加特定日期