python - numpy 数组的动态高级索引
问题描述
我想实现一个可以计算大型数组(不完全适合 RAM)的基本数学运算的函数。因此,我想创建一个函数,该函数将在选定的轴上逐块处理给定的操作。这个函数的主要思想是这样的:
def process_operation(inputs, output, operation):
shape = inputs[0].shape
for index in range(shape[axis]):
output[index,:] = inputs[0][index:] + inputs[1][index:]
但我希望能够通过对块进行切片/索引来更改轴。
是否可以不使用“:”语法糖以某种动态方式进行索引?
我在这里找到了一些帮助,但到目前为止并没有太大帮助:
谢谢
解决方案
slice
我认为你可以使用 python 的内置类型来实现你想要的。
在:
幕后,方括号内使用的 - 表达式将转换为 的实例slice
,但您也可以使用 aslice
开头。要遍历输入的不同轴,您可以使用slice
正确长度的 s 元组。
这可能看起来像:
def process_operation(inputs, output, axis=0):
shape = inputs[0].shape
for index in range(shape[axis]):
my_slice = (slice(None),) * axis + (index,)
output[my_slice] = inputs[0][my_slice] + inputs[1][my_slice]
我相信这应该适用于 h5py 数据集或内存映射数组,无需任何修改。
背景slice
和__getitem__
slice
与 一起使用__getitem__
以评估x[key]
语法。x[key]
分两步评估:
- If
key
包含任何表达式,例如:
,i:j
或者i:j:k
然后将这些表达式去糖化为slice
实例。 key
被传递给__getitem__
对象的方法x
。该方法负责返回正确的值x[key]
例如,表达式:
x[2]
y[:, ::2]
相当于:
x.__getitem__(2)
y.__getitem__((slice(None), slice(None, None, 2)))
您可以使用如下类来探索如何将值转换为切片:
class Sliceable:
def __getitem__(self, key):
print(key)
x = Sliceable()
x[::2] # prints "slice(None, None, 2)"
推荐阅读
- javascript - 在php中的表中添加onclick事件
- wordpress - 如何使用 gform_product_info 更新重力表格上的总条目
- c# - 从 url MSBUILD xml 恢复 Nuget 包
- java - jQuery 终端 - 以字符串形式读取 Java 中的 shell 响应会在 jQuery 终端中显示奇怪的字符
- python - 嵌入时出错:无法将字符串转换为浮点数:'ng'
- wordpress - Woocommerce 只读计费字段 - 选择和单选字段
- c# - Entityframework为什么耦合表会得到重复值?
- symfony - 如何调试捆绑中的 DependencyInjection ?
- websphere - websphere application server 8.5.5 创建了很多到 ldap 的连接
- javascript - 到达带有锚点的页面时触发事件