我有一个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模块中是否存在任何此类构造?
答案 0 :(得分:7)
根据numpy
关于indexing的文档中的建议,您可以使用slice
内置函数和元组串联来创建变量索引。
实际上,下标中的:
只是slice
文字的文字符号。
特别是:
相当于slice(None)
(其本身相当于slice(None, None, None)
,其中参数为start
,stop
和{{1} }})。
例如:
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
s的tuple
。
答案 1 :(得分:0)
您可以使用选择所需维度的代码撰写字符串,并使用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的策略相同。