[英]Building a tuple containing colons to be used to index a numpy array
我创建了一个用于处理特定类型的多维数据的类。 此类具有三个属性: 包含轴名称的列表 ( self.axisNames ); 包含沿每个轴的参数值的字典( self.axes ;使用轴名称中的条目键入); 和一个包含数据的 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的元组中获得 :(或等效项)? 这可能是解决问题的糟糕方法吗?
在索引[]
,一个:
被转换为一个slice
,整个内容作为一个元组传递给__getitem__
indexList = []
for axis in self.axisNames:
if axis in indexSpec:
indexList.append(indexSpec[axis])
else:
indexList.append(slice(None))
有几个numpy
函数使用这样的索引技巧 - 即构建索引值和切片的元组。 或者,如果他们需要改变它,他们将从一个列表开始,该列表可以变异,并在使用前将其转换为元组。 (例如np.apply_along_axis
)
是的,切片的完整规范是slice(start, stop, step)
,开始和停止是可选的。 与np.arange
或range
相同。 而None
等价于:
表达式中未指定的值。
np.lib.index_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
的切片语法。 例如:
mySpec = {'axis1': np.s_[10:15], 'axis3': np.s_[7:8]}
mySlicedArr = myBlob.intensityArr[myBlob.indexIntensityArr(mySpec)]
(额外信息: np.s_[7: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_[10:15]
您可以将np.s_[10:15]
指定为slice(10, 15)
,将np.s_[:]
为slice(None)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.