Python:在任意维度中使用冒号运算符索引数组

标签 python arrays numpy colon matrix-indexing

我有一个 numpy nd 数组。我的任务的一个简化版本是从每个轴获取一个向量。举例说明:

import numpy
x = numpy.array(range(24)).reshape((2,3,4))
x0 = x[0,0,:]
x1 = x[0,:,0]
x2 = x[:,0,0]

但是我不一定知道 x 的维数。因此,挑战在于如何将冒号:索引运算符放在可变位置。此类语法的示例:

n = x.ndim
ind = list(np.zeros(n))
dim = 0
ind[dim] = ':'
y = x[ind]

y = indexer.index(x,ind)

对于一些模块索引器。我可以写它,但我觉得这一定已经解决了,我不可能是唯一一个想这样做的人。例如,在 MATLAB 中,您可以使用 subsref() 函数执行此操作。

python/numpy/其他模块中是否存在任何此类结构?

最佳答案

根据 numpy 关于 indexing 的文档中的建议你可以使用slice内置函数和元组连接以创建变量索引。

事实上,下标中的 : 只是 slice 文字的文字符号。

特别是 : 等同于 slice(None)(它本身等同于 slice(None, None, None)其中参数是 startstopstep)。

例如:

a[(0,) * N + (slice(None),)]

相当于:

a[0, 0, ..., 0, :]   # with N zeros

切片的 : 表示法只能直接在下标内使用。例如这失败了:

In [10]: a[(0,0,:)]
  File "<ipython-input-10-f41b33bd742f>", line 1
    a[(0,0,:)]
           ^
SyntaxError: invalid syntax

要允许从任意维度的数组中提取切片,您可以编写一个简单的函数,例如:

def make_index(num_dimension, slice_pos):
    zeros = [0] * num_dimension
    zeros[slice_pos] = slice(None)
    return tuple(zeros)

并将其用作:

In [3]: a = np.array(range(24)).reshape((2, 3, 4))

In [4]: a[make_index(3, 2)]
Out[4]: array([0, 1, 2, 3])

In [5]: a[make_index(3, 1)]
Out[5]: array([0, 4, 8])

In [6]: a[make_index(3, 0)]
Out[6]: array([ 0, 12])

您可以概括make_index 来做任何事情。要记住的重要一点是,它最终应该返回一个包含整数或 slicetuple

关于Python:在任意维度中使用冒号运算符索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432209/

相关文章:

python - 如何用 Pandas 中 2 列 groupby 的均值中位数填充 NA?

python - 如何使用日期和数据列在 python 中访问、调用或提取单变量时间序列数据的元素

python - 测试 Django 对 Stripe Webhook 的响应

javascript - Lodash:将具有重复值的数组转换为具有重复出现次数的对象

python - xarray 的 apply_ufunc 中 dask=parallelized 和 dask=allowed 有什么区别?

python-3.x - 无法对字典中的值进行 numpy 操作

python - 有没有办法在执行连接操作时证明子字符串的合理性

c++ - 需要初始化一个 const 大数组

PHP:如何从此 XML 获取关联数组?

python pandas 自定义聚合函数