Python 构建包含冒号的元组以用于索引numpy数组

Python 构建包含冒号的元组以用于索引numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我创建了一个类,用于处理特定类型的多维数据。此类有三个属性:包含轴名称的列表(self.axisNames);包含沿每个轴的参数值的字典(self.axes;使用axisNames中的条目键入);以及一个包含数据的numpy数组,每个轴都有一个维度(self.intensityArr) 该类还具有根据特定情况需要动态添加新轴的函数,这使得索引强度ARR成为一个棘手的问题。为了更好地编制索引,我已经开始编写一个函数来构建我需要的索引: 课堂内: def indexIntensityArr(self

我创建了一个类,用于处理特定类型的多维数据。此类有三个属性:包含轴名称的列表(self.axisNames);包含沿每个轴的参数值的字典(self.axes;使用axisNames中的条目键入);以及一个包含数据的numpy数组,每个轴都有一个维度(self.intensityArr

该类还具有根据特定情况需要动态添加新轴的函数,这使得索引强度ARR成为一个棘手的问题。为了更好地编制索引,我已经开始编写一个函数来构建我需要的索引:

课堂内:

def indexIntensityArr(self,indexSpec):
    # indexSpec is a dictionary containing axisName:indexVal entries (indexVal is an int)
    # I want the function to return a tuple for use in indexing (see below def)
    indexList = []
    for axis in self.axisNames:
        if axis in indexSpec:
            indexList.append(indexSpec[axis])
        else:
            # <do something to add : to index list (tuple)>
    return tuple(indexList)
# ... create an instance of my class called myBlob with 4 dimensions ...

mySpec = {'axis1':10,'axis3':7}
mySlicedArr = myBlob.intensityArr[myBlob.indexIntensityArr(mySpec)]
我希望上面的结果是mySlicedArr是一个二维数组


我需要在'else'子句中添加什么才能在用于索引强度arr的元组中获得:(或等效值)?这可能是解决问题的一种不好的方法吗?

在索引
[]
中,一个
被转换为
片段
,整个内容作为元组传递给
\uu getitem\uuuuuu

indexList = []
for axis in self.axisNames:
    if axis in indexSpec:
        indexList.append(indexSpec[axis])
    else:
        indexList.append(slice(None))
有几个
numpy
函数使用这样的索引技巧,即建立索引值和切片的元组。或者,如果他们需要改变它,他们将从一个列表开始,这个列表可以改变,并在使用之前将其转换为元组。(例如,沿轴应用)

是的,切片的完整规范是
切片(开始、停止、步骤)
,启动和停止可选。与
np.arange
range
相同。而
None
相当于
表达式中的未指定值

np.lib.index\u tricks.py
中的一个小自定义类将:符号转换为片:

In [61]: np.s_[:,:1,0:,::3]
Out[61]: 
(slice(None, None, None),
 slice(None, 1, None),
 slice(0, None, None),
 slice(None, None, 3))

为了补充hpaulj的答案,您可以非常简单地通过使用
np.s
扩展您的设置,使其更加通用。与
slice
相比,使用此函数的优点是可以更轻松、更透明地使用
numpy
的slice语法。例如:

mySpec = {'axis1': np.s_[10:15], 'axis3': np.s_[7:8]}
mySlicedArr = myBlob.intensityArr[myBlob.indexIntensityArr(mySpec)]
(额外信息:
np.s\u7:8]
仅检索第7列,但它保留了维度,即切片数组仍将是4D,该维度中的形状为1:对于广播非常有用)

如果您希望在函数定义中也使用相同的语法:

indexList = []
for axis in self.axisNames:
    if axis in indexSpec:
        indexList.append(indexSpec[axis])
    else:
        indexList.append(np.s_[:])
return tuple(indexList)

使用
slice
可以同样出色地完成所有这一切。你可以指定
np.s_U[10:15]
slice(10,15)
np.s_U[:]
slice(None)
,正如hpaulj所说。

我不能100%肯定我理解你的问题,但如果我理解,我想你可能会想把
indexList=(slice(),)
else
子句中。我还认为您应该仔细查看切片。我的印象是,您正在尝试重新发明numpy的结构化阵列或类似smth的产品that@dnalow这确实是一个用例,它可能会从numpy的结构化数组之类的东西的使用中受益。然而,这段代码将传递给其他经验比我少的学生和研究人员,因此我将尽可能地限制自己使用通用结构。这正是我所需要的!我只想补充一下@Praveen所说的,在接受之前,您可以使用
切片(开始,结束)
进行实际切片(当然是更复杂的
如果
),谢谢您提供的奖金信息。这个解决方案可能就是我要使用的,因为它增加了传递切片的功能,但是@hpaulj的答案更直接地回答了这个问题。