13

我有一个 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 / other 模块中是否存在任何这样的构造?

4

2 回答 2

16

正如numpy's documentation about indexing中所建议的那样,您可以使用slice内置函数和元组连接来创建变量索引。

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

特别:是等价于slice(None)(它本身就等价于slice(None, None, None)参数是start,stop和的地方step)。

例如:

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做任何事情。要记住的重要一点是,它最终应该返回tuple包含整数或slices 的 a。

于 2014-06-26T15:36:22.627 回答
2

您可以使用选择所需维度的代码组成一个字符串,并使用 eval 执行该代码字符串。

一个开始是:

n = 2
sel = "0,"*(n-1) + ":"
eval('x[' + sel + ']')

为了得到你想要的东西,想法有点复杂(但不是那么多):

ind = 2
n = 3
sel = "".join([ ("0" if i != ind else ":") + ("," if i < n-1 else "") for i in xrange(n)])
eval('x[' + sel + ']')

这与用于动态 SQL 的策略相同。

于 2014-06-26T13:58:34.223 回答